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 #[structopt(author, visible_alias("i"))]
45 Init(OptCompeteInit),
46
47 #[structopt(author, visible_alias("m"))]
49 Migrate(OptCompeteMigrate),
50
51 #[structopt(author, visible_alias("l"))]
53 Login(OptCompeteLogin),
54
55 #[structopt(author, visible_alias("p"))]
57 Participate(OptCompeteParticipate),
58
59 #[structopt(author, visible_alias("n"))]
61 New(OptCompeteNew),
62
63 #[structopt(author, visible_alias("a"))]
64 Add(OptCompeteAdd),
65
66 #[structopt(author, visible_alias("r"))]
68 Retrieve(OptCompeteRetrieve),
69
70 #[structopt(author, visible_alias("d"))]
72 Download(OptCompeteRetrieveTestcases),
73
74 #[structopt(author, visible_alias("w"))]
76 Watch(OptCompeteWatch),
77
78 #[structopt(author, visible_alias("o"))]
80 Open(OptCompeteOpen),
81
82 #[structopt(author, visible_alias("t"))]
84 Test(OptCompeteTest),
85
86 #[structopt(author, visible_alias("s"))]
88 Submit(OptCompeteSubmit),
89}
90
91#[derive(StructOpt, Debug)]
92pub enum OptCompeteMigrate {
93 #[structopt(author, visible_alias("c"))]
95 CargoAtcoder(OptCompeteMigrateCargoAtcoder),
96}
97
98#[derive(StructOpt, Debug)]
99pub enum OptCompeteRetrieve {
100 #[structopt(author, visible_alias("t"))]
102 Testcases(OptCompeteRetrieveTestcases),
103
104 #[structopt(author, visible_alias("ss"))]
106 SubmissionSummaries(OptCompeteRetrieveSubmissionSummaries),
107}
108
109#[derive(StructOpt, Debug)]
110pub enum OptCompeteWatch {
111 #[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}