]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/perl -w | |
2 | use v5.14; | |
3 | ||
4 | use Gruntmaster::Data qw/insert_problem remove_problem set_problem_meta problems/; | |
5 | ||
6 | use IO::Prompter [ -style => 'bold', '-stdio', '-verbatim' ]; | |
7 | use File::Slurp qw/read_file/; | |
8 | use Term::ANSIColor qw/RED RESET/; | |
9 | ||
10 | ################################################## | |
11 | ||
12 | sub cmd_help{ | |
13 | exec perldoc => $0 | |
14 | } | |
15 | ||
16 | sub prompt_file{ | |
17 | my ($meta, $name, $prefix) = @_; | |
18 | my $filename = prompt '$prefix filename', -complete => 'filenames'; | |
19 | $meta->{files}{$name}{content} = read_file $filename; | |
20 | $meta->{files}{$name}{format} = prompt '$prefix format', -menu => [keys Gruntmaster::Page::Log::FORMAT_EXTENSION()]; | |
21 | $meta->{files}{$name}{name} = prompt "$prefix filename [$filename]", -default => $filename; | |
22 | ||
23 | } | |
24 | ||
25 | sub cmd_add{ | |
26 | my $id = shift; | |
27 | my $contest = prompt 'Contest'; | |
28 | local $Gruntmaster::Data::contest = $contest if $contest; | |
29 | my $name = prompt 'Problem name'; | |
30 | my $level = prompt 'Problem level'; | |
31 | my $statement = read_file prompt 'File with problem statement', -complete => 'filenames'; | |
32 | my %meta; | |
33 | $meta{generator} = prompt 'Generator', -menu => "File\nRun\nUndef"; | |
34 | $meta{runner} = prompt 'Runner', -menu => "File\nVerifier\nInteractive"; | |
35 | $meta{judge} = prompt 'Judge', -menu => "Absolute\nPoints"; | |
36 | $meta{testcnt} = prompt 'Test count', '-i'; | |
37 | ||
38 | if ($meta{generator} eq 'File') { | |
39 | my $prefix = prompt '[Generator::File] Input file prefix'; | |
40 | $meta{infile}[$_ - 1] = read_file "$prefix$_.in" for 1 .. $meta{testcnt}; | |
41 | } | |
42 | ||
43 | prompt_file \%meta, gen => '[Generator::Run] Generator' if $meta{generator} eq 'Run'; | |
44 | ||
45 | if ($meta{runner} eq 'File') { | |
46 | my $prefix = prompt '[Runner::File] Output file prefix'; | |
47 | $meta{okfile}[$_ - 1] = read_file "$prefix$_.ok" for 1 .. $meta{testcnt}; | |
48 | $meta{tests}[$_ - 1] = prompt "[Runner::File] Score for test ${_} [10]", '-i', -default => 10 for 1 .. $meta{testcnt}; | |
49 | } | |
50 | ||
51 | prompt_file \%meta, ver => '[Runner::Verifier] Verifier' if $meta{runner} eq 'Verifier'; | |
52 | ||
53 | if ($meta{runner} eq 'Interactive') { | |
54 | say RED, 'WARNING: Runner::Interactive is experimental', RESET; | |
55 | prompt_file int => '[Runner::Interactive] Interactive verifier'; | |
56 | } | |
57 | ||
58 | insert_problem $id => name => $name, level => $level, statement => $statement; | |
59 | set_problem_meta $id => \%meta; | |
60 | } | |
61 | ||
62 | sub cmd_list{ | |
63 | my $contest = shift; | |
64 | local $Gruntmaster::Data::contest = $contest if $contest; | |
65 | print problems; | |
66 | } | |
67 | ||
68 | sub cmd_rm{ | |
69 | remove_problem shift | |
70 | } | |
71 | ||
72 | sub cmd_show{ | |
73 | local $_ = shift or goto &cmd_list; | |
74 | } | |
75 | ||
76 | ################################################## | |
77 | ||
78 | no strict 'refs'; | |
79 | my $cmd = 'cmd_' . shift; | |
80 | cmd_help unless exists $main::{$cmd}; | |
81 | $cmd->(@ARGV) if exists $main::{$cmd}; | |
82 | ||
83 | 1; | |
84 | __END__ | |
85 | ||
86 | =encoding utf-8 | |
87 | ||
88 | =head1 NAME | |
89 | ||
90 | gruntmaster-problem - shell interface to Gruntmaster 6000 problems | |
91 | ||
92 | =head1 SYNOPSIS | |
93 | ||
94 | gruntmaster-problem add problem_id | |
95 | gruntmaster-problem list | |
96 | gruntmaster-problem rm problem_id | |
97 | gruntmaster-problem show problem_id | |
98 | ||
99 | ||
100 | =head1 DESCRIPTION | |
101 | ||
102 | ||
103 | ||
104 | =cut |