use course_matcher as cm;
use crate::models::{
Course as ServiceCourse, CourseIdentifier as ServiceIdent,
EducationalLevel as ServiceLevel, IdentifierType, LearningResourceType as ServiceLRT,
};
pub fn to_matcher_course(c: &ServiceCourse) -> cm::Course {
cm::Course {
name: c.name.clone(),
alternate_names: c.alternate_names.clone(),
course_code: c.course_code.clone(),
provider_id: c.provider_id.map(|u| u.to_string()),
provider_name: None,
educational_level: c.educational_level.as_ref().map(level_to_matcher),
learning_resource_type: c.learning_resource_type.as_ref().map(lrt_to_matcher),
keywords: c.keywords.clone(),
teaches: c.teaches.clone(),
identifiers: c.identifiers.iter().map(ident_to_matcher).collect(),
same_as: c.same_as.clone(),
in_language: c.in_language.clone(),
}
}
fn ident_to_matcher(i: &ServiceIdent) -> cm::CourseIdentifier {
cm::CourseIdentifier {
scheme: scheme_to_matcher(&i.property_id),
value: i.value.clone(),
}
}
fn scheme_to_matcher(t: &IdentifierType) -> cm::IdentifierScheme {
match t {
IdentifierType::LmsCourseId => cm::IdentifierScheme::LmsCourseId,
IdentifierType::CourseCode => cm::IdentifierScheme::CourseCode,
IdentifierType::PlatformSlug => cm::IdentifierScheme::PlatformSlug,
IdentifierType::Oer => cm::IdentifierScheme::Oer,
IdentifierType::Doi => cm::IdentifierScheme::Doi,
IdentifierType::Lom => cm::IdentifierScheme::Lom,
IdentifierType::Wikidata => cm::IdentifierScheme::Wikidata,
IdentifierType::Isced => cm::IdentifierScheme::Isced,
IdentifierType::Ror => cm::IdentifierScheme::Ror,
IdentifierType::Uri => cm::IdentifierScheme::Uri,
IdentifierType::Uuid => cm::IdentifierScheme::Uuid,
IdentifierType::Custom(s) => cm::IdentifierScheme::Custom(s.clone()),
}
}
fn level_to_matcher(l: &ServiceLevel) -> cm::EducationalLevel {
match l {
ServiceLevel::Beginner => cm::EducationalLevel::Beginner,
ServiceLevel::Intermediate => cm::EducationalLevel::Intermediate,
ServiceLevel::Advanced => cm::EducationalLevel::Advanced,
ServiceLevel::Expert => cm::EducationalLevel::Expert,
ServiceLevel::PrimaryEducation => cm::EducationalLevel::PrimaryEducation,
ServiceLevel::SecondaryEducation => cm::EducationalLevel::SecondaryEducation,
ServiceLevel::HigherEducation => cm::EducationalLevel::HigherEducation,
ServiceLevel::Undergraduate => cm::EducationalLevel::Undergraduate,
ServiceLevel::Graduate => cm::EducationalLevel::Graduate,
ServiceLevel::Postgraduate => cm::EducationalLevel::Postgraduate,
ServiceLevel::Vocational => cm::EducationalLevel::Vocational,
ServiceLevel::ProfessionalDevelopment => cm::EducationalLevel::ProfessionalDevelopment,
ServiceLevel::Custom(s) => cm::EducationalLevel::Custom(s.clone()),
}
}
fn lrt_to_matcher(l: &ServiceLRT) -> cm::LearningResourceType {
match l {
ServiceLRT::Lecture => cm::LearningResourceType::Lecture,
ServiceLRT::Tutorial => cm::LearningResourceType::Tutorial,
ServiceLRT::Workshop => cm::LearningResourceType::Workshop,
ServiceLRT::Assignment => cm::LearningResourceType::Assignment,
ServiceLRT::Reading => cm::LearningResourceType::Reading,
ServiceLRT::Video => cm::LearningResourceType::Video,
ServiceLRT::Audio => cm::LearningResourceType::Audio,
ServiceLRT::Exam => cm::LearningResourceType::Exam,
ServiceLRT::Simulation => cm::LearningResourceType::Simulation,
ServiceLRT::Project => cm::LearningResourceType::Project,
ServiceLRT::Discussion => cm::LearningResourceType::Discussion,
ServiceLRT::Custom(s) => cm::LearningResourceType::Custom(s.clone()),
}
}
#[cfg(test)]
mod tests {
use super::*;
use uuid::Uuid;
#[test]
fn provider_id_uuid_routes_to_matcher_string() {
let mut c = ServiceCourse::new("Linear Algebra");
let pid = Uuid::new_v4();
c.provider_id = Some(pid);
let m = to_matcher_course(&c);
assert_eq!(m.provider_id.as_deref(), Some(pid.to_string().as_str()));
}
#[test]
fn identifier_scheme_routes_one_to_one() {
let mut c = ServiceCourse::new("CS101");
c.identifiers = vec![
ServiceIdent {
property_id: IdentifierType::Doi,
value: "10.1234/abc".into(),
name: None,
url: None,
},
ServiceIdent {
property_id: IdentifierType::Custom("KhanCourse".into()),
value: "kc-42".into(),
name: None,
url: None,
},
];
let m = to_matcher_course(&c);
assert!(matches!(m.identifiers[0].scheme, cm::IdentifierScheme::Doi));
assert!(matches!(
m.identifiers[1].scheme,
cm::IdentifierScheme::Custom(ref s) if s == "KhanCourse"
));
}
#[test]
fn educational_level_routes_one_to_one() {
let mut c = ServiceCourse::new("Intro");
c.educational_level = Some(ServiceLevel::Undergraduate);
let m = to_matcher_course(&c);
assert!(matches!(
m.educational_level,
Some(cm::EducationalLevel::Undergraduate)
));
}
}