rustev_contract/
source.rs1use serde::{Deserialize, Serialize};
7
8use crate::definition::ProvenanceClass;
9use crate::grade::Grade;
10use crate::ids::SourceId;
11use crate::limits::DESCRIPTOR_V1;
12use crate::schema;
13
14#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
15#[serde(deny_unknown_fields)]
16pub struct SourceDescriptor {
17 pub schema: String,
18 pub name: String,
21 pub version: String,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub facts: Option<Vec<Fact>>,
27 #[serde(
29 default,
30 skip_serializing_if = "Option::is_none",
31 deserialize_with = "crate::acquisition::operations"
32 )]
33 #[schemars(with = "Vec<crate::acquisition::Operation>", length(min = 1, max = 64))]
34 pub operations: Option<Vec<crate::acquisition::Operation>>,
35}
36
37crate::document::document!(SourceDescriptor, schema::SOURCE, DESCRIPTOR_V1, SourceId);
38
39#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
41#[serde(deny_unknown_fields)]
42pub struct Fact {
43 pub name: String,
45 pub provenance: ProvenanceClass,
46 pub grades: Vec<FactGrade>,
48}
49
50#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
52#[serde(deny_unknown_fields)]
53pub struct FactGrade {
54 pub path: String,
57 pub max_grade: Grade,
58 pub reliability: Reliability,
59}
60
61#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
62#[serde(rename_all = "snake_case", deny_unknown_fields)]
63pub enum Reliability {
64 Reliable,
65 KnownUnreliable {
67 note: String,
69 },
70}
71
72impl FactGrade {
73 pub fn limit(&self) -> Grade {
76 match self.reliability {
77 Reliability::Reliable => self.max_grade,
78 Reliability::KnownUnreliable { .. } => Grade::Hint,
79 }
80 }
81}
82
83pub fn valid_source_name(s: &str) -> bool {
85 !s.is_empty()
86 && s.len() <= 64
87 && s.bytes()
88 .all(|b| b.is_ascii_lowercase() || b.is_ascii_digit() || b == b'_' || b == b'-')
89}