Skip to content

Commit 6a48bd3

Browse files
committed
get-course-data command
1 parent 98aa7c7 commit 6a48bd3

File tree

3 files changed

+52
-8
lines changed

3 files changed

+52
-8
lines changed

tmc-langs-cli/src/app.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Create clap app
22
3+
use crate::output::CombinedCourseData;
34
use clap::{App, AppSettings, Arg, SubCommand};
45
use schemars::JsonSchema;
56
use std::path::PathBuf;
@@ -265,6 +266,15 @@ fn create_core_app() -> App<'static, 'static> {
265266
.value_names(&["exercise-id", "exercise-path"])
266267
.multiple(true)))
267268

269+
.subcommand(SubCommand::with_name("get-course-data")
270+
.about("Fetches course data. Combines course details, course exercises and course settings.")
271+
.long_about(schema_leaked::<CombinedCourseData>())
272+
.arg(Arg::with_name("course-id")
273+
.help("The ID of the course.")
274+
.long("course-id")
275+
.required(true)
276+
.takes_value(true)))
277+
268278
.subcommand(SubCommand::with_name("get-course-details")
269279
.about("Fetches course details.")
270280
.long_about(schema_leaked::<CourseDetails>())

tmc-langs-cli/src/main.rs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
mod app;
44
mod output;
55

6-
use output::{ErrorData, Kind, Output, OutputResult, Status};
6+
use output::{CombinedCourseData, ErrorData, Kind, Output, OutputResult, Status};
77

88
use anyhow::{Context, Result};
99
use clap::{ArgMatches, Error, ErrorKind};
@@ -604,11 +604,37 @@ fn run_core(matches: &ArgMatches) -> Result<PrintToken> {
604604
};
605605
print_output(&output)?
606606
}
607+
("get-course-data", Some(matches)) => {
608+
let course_id = matches.value_of("course-id").unwrap();
609+
let course_id = into_usize(course_id)?;
610+
611+
let details = core
612+
.get_course_details(course_id)
613+
.context("Failed to get course details")?;
614+
let exercises = core
615+
.get_course_exercises(course_id)
616+
.context("Failed to get course")?;
617+
let settings = core.get_course(course_id).context("Failed to get course")?;
618+
let data = CombinedCourseData {
619+
details,
620+
exercises,
621+
settings,
622+
};
623+
624+
let output = Output {
625+
status: Status::Finished,
626+
message: None,
627+
result: OutputResult::RetrievedData,
628+
percent_done: 1.0,
629+
data: Some(data),
630+
};
631+
print_output(&output)?
632+
}
607633
("get-course-details", Some(matches)) => {
608634
let course_id = matches.value_of("course-id").unwrap();
609635
let course_id = into_usize(course_id)?;
610636

611-
let course_details = core
637+
let details = core
612638
.get_course_details(course_id)
613639
.context("Failed to get course details")?;
614640

@@ -617,15 +643,15 @@ fn run_core(matches: &ArgMatches) -> Result<PrintToken> {
617643
message: None,
618644
result: OutputResult::RetrievedData,
619645
percent_done: 1.0,
620-
data: Some(course_details),
646+
data: Some(details),
621647
};
622648
print_output(&output)?
623649
}
624650
("get-course-exercises", Some(matches)) => {
625651
let course_id = matches.value_of("course-id").unwrap();
626652
let course_id = into_usize(course_id)?;
627653

628-
let course = core
654+
let exercises = core
629655
.get_course_exercises(course_id)
630656
.context("Failed to get course")?;
631657

@@ -634,22 +660,22 @@ fn run_core(matches: &ArgMatches) -> Result<PrintToken> {
634660
message: None,
635661
result: OutputResult::RetrievedData,
636662
percent_done: 1.0,
637-
data: Some(course),
663+
data: Some(exercises),
638664
};
639665
print_output(&output)?
640666
}
641667
("get-course-settings", Some(matches)) => {
642668
let course_id = matches.value_of("course-id").unwrap();
643669
let course_id = into_usize(course_id)?;
644670

645-
let course = core.get_course(course_id).context("Failed to get course")?;
671+
let settings = core.get_course(course_id).context("Failed to get course")?;
646672

647673
let output = Output {
648674
status: Status::Finished,
649675
message: None,
650676
result: OutputResult::RetrievedData,
651677
percent_done: 1.0,
652-
data: Some(course),
678+
data: Some(settings),
653679
};
654680
print_output(&output)?
655681
}

tmc-langs-cli/src/output.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
//! Output format
22
3+
use schemars::JsonSchema;
34
use serde::Serialize;
4-
use tmc_langs_core::StatusType;
5+
use tmc_langs_core::{CourseData, CourseDetails, CourseExercise, StatusType};
56

67
/// The format for all messages written to stdout by the CLI
78
#[derive(Debug, Serialize)]
@@ -79,3 +80,10 @@ pub enum Kind {
7980
/// Failed to connect to the TMC server, likely due to no internet connection
8081
ConnectionError,
8182
}
83+
84+
#[derive(Debug, Serialize, JsonSchema)]
85+
pub struct CombinedCourseData {
86+
pub details: CourseDetails,
87+
pub exercises: Vec<CourseExercise>,
88+
pub settings: CourseData,
89+
}

0 commit comments

Comments
 (0)