use serde::{Deserialize, Serialize};
use crate::definition::ProvenanceClass;
use crate::grade::Grade;
use crate::ids::SourceId;
use crate::limits::DESCRIPTOR_V1;
use crate::schema;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct SourceDescriptor {
pub schema: String,
pub name: String,
pub version: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub facts: Option<Vec<Fact>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::acquisition::operations"
)]
#[schemars(with = "Vec<crate::acquisition::Operation>", length(min = 1, max = 64))]
pub operations: Option<Vec<crate::acquisition::Operation>>,
}
crate::document::document!(SourceDescriptor, schema::SOURCE, DESCRIPTOR_V1, SourceId);
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Fact {
pub name: String,
pub provenance: ProvenanceClass,
pub grades: Vec<FactGrade>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct FactGrade {
pub path: String,
pub max_grade: Grade,
pub reliability: Reliability,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub enum Reliability {
Reliable,
KnownUnreliable {
note: String,
},
}
impl FactGrade {
pub fn limit(&self) -> Grade {
match self.reliability {
Reliability::Reliable => self.max_grade,
Reliability::KnownUnreliable { .. } => Grade::Hint,
}
}
}
pub fn valid_source_name(s: &str) -> bool {
!s.is_empty()
&& s.len() <= 64
&& s.bytes()
.all(|b| b.is_ascii_lowercase() || b.is_ascii_digit() || b == b'_' || b == b'-')
}