cargo_compete/
lib.rs

1#![forbid(unsafe_code)]
2#![warn(rust_2018_idioms)]
3
4mod commands;
5mod config;
6mod fs;
7mod oj_api;
8mod open;
9mod process;
10mod project;
11pub mod shell;
12mod testing;
13mod web;
14
15use crate::{
16    commands::{
17        add::OptCompeteAdd, init::OptCompeteInit, login::OptCompeteLogin,
18        migrate_cargo_atcoder::OptCompeteMigrateCargoAtcoder, new::OptCompeteNew,
19        open::OptCompeteOpen, participate::OptCompeteParticipate,
20        retrieve_submission_summaries::OptCompeteRetrieveSubmissionSummaries,
21        retrieve_testcases::OptCompeteRetrieveTestcases, submit::OptCompeteSubmit,
22        test::OptCompeteTest, watch_submissions::OptCompeteWatchSubmissions,
23    },
24    shell::Shell,
25};
26use std::path::PathBuf;
27use structopt::{clap::AppSettings, StructOpt};
28
29#[derive(StructOpt, Debug)]
30#[structopt(
31    about,
32    author,
33    bin_name("cargo"),
34    global_settings(&[AppSettings::DeriveDisplayOrder, AppSettings::UnifiedHelpMessage])
35)]
36pub enum Opt {
37    #[structopt(about, author)]
38    Compete(OptCompete),
39}
40
41#[derive(StructOpt, Debug)]
42pub enum OptCompete {
43    /// Create `compete.toml` and some files
44    #[structopt(author, visible_alias("i"))]
45    Init(OptCompeteInit),
46
47    /// Migrate
48    #[structopt(author, visible_alias("m"))]
49    Migrate(OptCompeteMigrate),
50
51    /// Login to a platform
52    #[structopt(author, visible_alias("l"))]
53    Login(OptCompeteLogin),
54
55    /// Register to a contest
56    #[structopt(author, visible_alias("p"))]
57    Participate(OptCompeteParticipate),
58
59    /// Retrieve test cases and create a package
60    #[structopt(author, visible_alias("n"))]
61    New(OptCompeteNew),
62
63    #[structopt(author, visible_alias("a"))]
64    Add(OptCompeteAdd),
65
66    /// Retrieve data
67    #[structopt(author, visible_alias("r"))]
68    Retrieve(OptCompeteRetrieve),
69
70    /// Alias for `retrieve testcases`
71    #[structopt(author, visible_alias("d"))]
72    Download(OptCompeteRetrieveTestcases),
73
74    /// Watch items
75    #[structopt(author, visible_alias("w"))]
76    Watch(OptCompeteWatch),
77
78    /// Open URLs and files
79    #[structopt(author, visible_alias("o"))]
80    Open(OptCompeteOpen),
81
82    /// Test your code
83    #[structopt(author, visible_alias("t"))]
84    Test(OptCompeteTest),
85
86    /// Submit your code
87    #[structopt(author, visible_alias("s"))]
88    Submit(OptCompeteSubmit),
89}
90
91#[derive(StructOpt, Debug)]
92pub enum OptCompeteMigrate {
93    /// Migrate existing packages
94    #[structopt(author, visible_alias("c"))]
95    CargoAtcoder(OptCompeteMigrateCargoAtcoder),
96}
97
98#[derive(StructOpt, Debug)]
99pub enum OptCompeteRetrieve {
100    /// Retrieve test cases
101    #[structopt(author, visible_alias("t"))]
102    Testcases(OptCompeteRetrieveTestcases),
103
104    /// Retrieve submission summaries
105    #[structopt(author, visible_alias("ss"))]
106    SubmissionSummaries(OptCompeteRetrieveSubmissionSummaries),
107}
108
109#[derive(StructOpt, Debug)]
110pub enum OptCompeteWatch {
111    /// Watch submissions
112    #[structopt(author, visible_alias("s"))]
113    Submissions(OptCompeteWatchSubmissions),
114}
115
116pub struct Context<'s> {
117    pub cwd: PathBuf,
118    pub cookies_path: PathBuf,
119    pub shell: &'s mut Shell,
120}
121
122pub fn run(opt: OptCompete, ctx: Context<'_>) -> anyhow::Result<()> {
123    match opt {
124        OptCompete::Init(opt) => commands::init::run(opt, ctx),
125        OptCompete::Migrate(OptCompeteMigrate::CargoAtcoder(opt)) => {
126            commands::migrate_cargo_atcoder::run(opt, ctx)
127        }
128        OptCompete::Login(opt) => commands::login::run(opt, ctx),
129        OptCompete::Participate(opt) => commands::participate::run(opt, ctx),
130        OptCompete::New(opt) => commands::new::run(opt, ctx),
131        OptCompete::Add(opt) => commands::add::run(opt, ctx),
132        OptCompete::Retrieve(OptCompeteRetrieve::Testcases(opt)) | OptCompete::Download(opt) => {
133            commands::retrieve_testcases::run(opt, ctx)
134        }
135        OptCompete::Retrieve(OptCompeteRetrieve::SubmissionSummaries(opt)) => {
136            commands::retrieve_submission_summaries::run(opt, ctx)
137        }
138        OptCompete::Watch(OptCompeteWatch::Submissions(opt)) => {
139            commands::watch_submissions::run(opt, ctx)
140        }
141        OptCompete::Open(opt) => commands::open::run(opt, ctx),
142        OptCompete::Test(opt) => commands::test::run(opt, ctx),
143        OptCompete::Submit(opt) => commands::submit::run(opt, ctx),
144    }
145}