dre_core/config/
dependencies.rs1use schemars::JsonSchema;
5use serde::Deserialize;
6use serde::de::Deserializer;
7
8use super::de::{Located, Loose, Map, OneOf, UnknownKeys};
9
10#[derive(Deserialize, JsonSchema)]
12#[schemars(title = "DRE dependencies", deny_unknown_fields)]
13pub struct DependenciesFile {
14 #[serde(default)]
15 #[schemars(schema_with = "plugins")]
16 pub plugins: Option<PluginsSection>,
17 pub packages: Option<Located<Loose<Vec<Loose<Package>>>>>,
19}
20
21#[derive(Deserialize)]
23pub struct PluginsKey {
24 pub plugins: Option<PluginsSection>,
25}
26
27pub type PluginsSection = Located<Loose<OneOf<Vec<Located<Loose<PluginItem>>>, Map<serde_json::Value>>>>;
29
30pub type PluginItem = OneOf<PackageName, OneOf<PinnedVersion, PluginEntry>>;
32
33#[derive(Deserialize, JsonSchema)]
35#[serde(transparent)]
36#[schemars(inline)]
37pub struct PackageName(pub String);
38
39#[derive(JsonSchema)]
41#[schemars(inline, extend("additionalProperties" = true, "minProperties" = 1, "maxProperties" = 1))]
42pub struct PinnedVersion {
43 #[schemars(skip)]
44 pub name: Located<String>,
45 #[schemars(skip)]
46 pub version: serde_json::Value,
47}
48
49impl<'de> Deserialize<'de> for PinnedVersion {
50 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
52 let m = Map::<serde_json::Value>::deserialize(d)?;
53 match <[_; 1]>::try_from(m.0) {
54 Ok([(name, version)]) if name.value != "name" => Ok(PinnedVersion { name, version }),
55 _ => Err(serde::de::Error::custom("not a single `name: version` pair")),
56 }
57 }
58}
59
60#[derive(Deserialize, JsonSchema)]
62#[schemars(deny_unknown_fields, inline)]
63pub struct PluginEntry {
64 #[schemars(with = "String")]
66 pub name: Loose<String>,
67 #[serde(default)]
69 #[schemars(with = "String")]
70 pub version: Option<serde_json::Value>,
71 #[serde(default)]
73 #[schemars(with = "String")]
74 pub github: Option<serde_json::Value>,
75 #[serde(default)]
77 #[schemars(with = "String")]
78 pub local: Option<serde_json::Value>,
79 #[serde(default)]
81 #[schemars(with = "String")]
82 pub registry: Option<serde_json::Value>,
83 #[serde(rename = "$unknown", default)]
84 #[schemars(skip)]
85 pub unknown: UnknownKeys,
86}
87
88#[derive(Deserialize, JsonSchema)]
90#[schemars(rename = "package", deny_unknown_fields)]
91#[schemars(extend("oneOf" = [{"required": ["git", "revision"]}, {"required": ["local"]}]))]
92pub struct Package {
93 pub git: Option<Loose<String>>,
95 pub revision: Option<Loose<String>>,
97 pub local: Option<Loose<String>>,
99 #[schemars(skip)]
101 pub package: Option<Loose<String>>,
102}
103
104#[derive(JsonSchema)]
106#[schemars(inline, extend("additionalProperties" = true))]
107#[allow(dead_code)]
108struct VersionMap {}
109
110#[derive(JsonSchema)]
112#[schemars(inline, extend("x-doc-type" = "list of plugin packages: a name, `name: \"<version>\"`, or a map (see below)"))]
113#[allow(dead_code)]
114struct Plugins(OneOf<Vec<Item>, OneOf<VersionMap, ()>>);
115
116#[derive(JsonSchema)]
118#[schemars(inline)]
119#[allow(dead_code)]
120struct Item(PluginItem);
121
122pub(super) fn plugins(g: &mut schemars::SchemaGenerator) -> schemars::Schema {
124 g.subschema_for::<Plugins>()
125}