#![forbid(unsafe_code)]
#![warn(rust_2018_idioms)]
mod commands;
mod config;
mod fs;
mod oj_api;
mod open;
mod process;
mod project;
pub mod shell;
mod testing;
mod web;
use crate::{
commands::{
add::OptCompeteAdd, init::OptCompeteInit, login::OptCompeteLogin,
migrate_cargo_atcoder::OptCompeteMigrateCargoAtcoder, new::OptCompeteNew,
open::OptCompeteOpen, participate::OptCompeteParticipate,
retrieve_submission_summaries::OptCompeteRetrieveSubmissionSummaries,
retrieve_testcases::OptCompeteRetrieveTestcases, submit::OptCompeteSubmit,
test::OptCompeteTest, watch_submissions::OptCompeteWatchSubmissions,
},
shell::Shell,
};
use std::path::PathBuf;
use structopt::{clap::AppSettings, StructOpt};
#[derive(StructOpt, Debug)]
#[structopt(
about,
author,
bin_name("cargo"),
global_settings(&[AppSettings::DeriveDisplayOrder, AppSettings::UnifiedHelpMessage])
)]
pub enum Opt {
#[structopt(about, author)]
Compete(OptCompete),
}
#[derive(StructOpt, Debug)]
pub enum OptCompete {
#[structopt(author, visible_alias("i"))]
Init(OptCompeteInit),
#[structopt(author, visible_alias("m"))]
Migrate(OptCompeteMigrate),
#[structopt(author, visible_alias("l"))]
Login(OptCompeteLogin),
#[structopt(author, visible_alias("p"))]
Participate(OptCompeteParticipate),
#[structopt(author, visible_alias("n"))]
New(OptCompeteNew),
#[structopt(author, visible_alias("a"))]
Add(OptCompeteAdd),
#[structopt(author, visible_alias("r"))]
Retrieve(OptCompeteRetrieve),
#[structopt(author, visible_alias("d"))]
Download(OptCompeteRetrieveTestcases),
#[structopt(author, visible_alias("w"))]
Watch(OptCompeteWatch),
#[structopt(author, visible_alias("o"))]
Open(OptCompeteOpen),
#[structopt(author, visible_alias("t"))]
Test(OptCompeteTest),
#[structopt(author, visible_alias("s"))]
Submit(OptCompeteSubmit),
}
#[derive(StructOpt, Debug)]
pub enum OptCompeteMigrate {
#[structopt(author, visible_alias("c"))]
CargoAtcoder(OptCompeteMigrateCargoAtcoder),
}
#[derive(StructOpt, Debug)]
pub enum OptCompeteRetrieve {
#[structopt(author, visible_alias("t"))]
Testcases(OptCompeteRetrieveTestcases),
#[structopt(author, visible_alias("ss"))]
SubmissionSummaries(OptCompeteRetrieveSubmissionSummaries),
}
#[derive(StructOpt, Debug)]
pub enum OptCompeteWatch {
#[structopt(author, visible_alias("s"))]
Submissions(OptCompeteWatchSubmissions),
}
pub struct Context<'s> {
pub cwd: PathBuf,
pub cookies_path: PathBuf,
pub shell: &'s mut Shell,
}
pub fn run(opt: OptCompete, ctx: Context<'_>) -> anyhow::Result<()> {
match opt {
OptCompete::Init(opt) => commands::init::run(opt, ctx),
OptCompete::Migrate(OptCompeteMigrate::CargoAtcoder(opt)) => {
commands::migrate_cargo_atcoder::run(opt, ctx)
}
OptCompete::Login(opt) => commands::login::run(opt, ctx),
OptCompete::Participate(opt) => commands::participate::run(opt, ctx),
OptCompete::New(opt) => commands::new::run(opt, ctx),
OptCompete::Add(opt) => commands::add::run(opt, ctx),
OptCompete::Retrieve(OptCompeteRetrieve::Testcases(opt)) | OptCompete::Download(opt) => {
commands::retrieve_testcases::run(opt, ctx)
}
OptCompete::Retrieve(OptCompeteRetrieve::SubmissionSummaries(opt)) => {
commands::retrieve_submission_summaries::run(opt, ctx)
}
OptCompete::Watch(OptCompeteWatch::Submissions(opt)) => {
commands::watch_submissions::run(opt, ctx)
}
OptCompete::Open(opt) => commands::open::run(opt, ctx),
OptCompete::Test(opt) => commands::test::run(opt, ctx),
OptCompete::Submit(opt) => commands::submit::run(opt, ctx),
}
}