wick_config/v0/
conversions.rs1use std::collections::HashMap;
2use std::str::FromStr;
3
4use flow_expression_parser::ast::{self, InstancePort, InstanceTarget};
5use flow_expression_parser::parse_id;
6use liquid_json::LiquidJsonValue;
7use option_utils::OptionUtils;
8
9use crate::error::ManifestError;
10use crate::utils::{opt_str_to_ipv4addr, VecTryMapInto};
11use crate::{config, v0, Result};
12
13impl TryFrom<v0::HostManifest> for config::ComponentConfiguration {
14 type Error = ManifestError;
15
16 fn try_from(def: v0::HostManifest) -> Result<Self> {
17 let flows: Vec<config::FlowOperation> = def.network.schematics.try_map_into()?;
18 let composite = config::CompositeComponentImplementation {
19 operations: flows,
20 config: Default::default(),
21 extends: Default::default(),
22 };
23 Ok(config::ComponentConfiguration {
24 source: None,
25 types: Default::default(),
26 requires: Default::default(),
27 import: def
28 .network
29 .collections
30 .into_iter()
31 .map(|val| {
32 Ok(config::Binding::new(
33 val.namespace.clone(),
34 config::ImportDefinition::component(val.try_into()?),
35 ))
36 })
37 .collect::<Result<Vec<_>>>()?,
38 component: config::ComponentImplementation::Composite(composite),
39 host: def.host.try_map_into()?,
40 name: def.network.name,
41 tests: Vec::new(),
42 metadata: None,
43 resources: Default::default(),
44 cached_types: Default::default(),
45 type_cache: Default::default(),
46 package: Default::default(),
47 root_config: Default::default(),
48 })
49 }
50}
51
52impl TryFrom<crate::v0::CollectionDefinition> for config::ImportDefinition {
53 type Error = crate::Error;
54 fn try_from(def: crate::v0::CollectionDefinition) -> std::result::Result<Self, Self::Error> {
55 Ok(config::ImportDefinition::Component(def.try_into()?))
56 }
57}
58
59impl TryFrom<crate::v0::CollectionDefinition> for config::ComponentDefinition {
60 type Error = crate::Error;
61 fn try_from(def: crate::v0::CollectionDefinition) -> std::result::Result<Self, Self::Error> {
62 let kind = match def.kind {
63 crate::v0::CollectionKind::Native => panic!("Can not define native components in a manifest"),
64 crate::v0::CollectionKind::GrpcUrl => {
65 config::ComponentDefinition::GrpcUrl(config::components::GrpcUrlComponent {
66 url: def.reference.clone(),
67 config: def.data.map(Into::into),
68 })
69 }
70 #[allow(deprecated)]
71 crate::v0::CollectionKind::WaPC => config::ComponentDefinition::Wasm(config::components::WasmComponent {
72 reference: def.reference.clone().try_into()?,
73 config: def.data.map(Into::into),
74 provide: Default::default(),
75 }),
76 crate::v0::CollectionKind::Network => {
77 config::ComponentDefinition::Manifest(config::components::ManifestComponent {
78 reference: def.reference.clone().try_into()?,
79 config: def.data.map(Into::into),
80 provide: Default::default(),
81 max_packet_size: None,
82 })
83 }
84 };
85 Ok(kind)
86 }
87}
88
89impl TryFrom<crate::v0::SchematicManifest> for config::FlowOperation {
90 type Error = ManifestError;
91
92 fn try_from(manifest: crate::v0::SchematicManifest) -> Result<Self> {
93 let instances: Result<HashMap<String, config::InstanceReference>> = manifest
94 .instances
95 .into_iter()
96 .map(|(key, val)| Ok((key, val.try_into()?)))
97 .collect();
98 let connections: Result<Vec<ast::FlowExpression>> = manifest
99 .connections
100 .into_iter()
101 .map(|def| Ok(ast::FlowExpression::connection(def.try_into()?)))
102 .collect();
103 Ok(Self {
104 name: manifest.name,
105 instances: instances?,
106 expressions: connections?,
107 inputs: Default::default(),
108 outputs: Default::default(),
109 config: Default::default(),
110 flows: Default::default(),
111 })
112 }
113}
114
115impl TryFrom<crate::v0::ComponentDefinition> for config::InstanceReference {
116 type Error = ManifestError;
117 fn try_from(def: crate::v0::ComponentDefinition) -> Result<Self> {
118 let (ns, name) = parse_id(&def.id)?;
119 Ok(config::InstanceReference {
120 component_id: ns.to_owned(),
121 name: name.to_owned(),
122 data: def.data.map_into(),
123 settings: None,
124 })
125 }
126}
127
128impl TryFrom<crate::v0::ConnectionDefinition> for ast::ConnectionExpression {
129 type Error = ManifestError;
130
131 fn try_from(def: crate::v0::ConnectionDefinition) -> Result<Self> {
132 let from: ast::ConnectionTargetExpression = def.from.clone().try_into()?;
133 let to: ast::ConnectionTargetExpression = def.to.try_into()?;
134 Ok(ast::ConnectionExpression::new(from, to))
135 }
136}
137
138impl TryFrom<crate::v0::ConnectionTargetDefinition> for ast::ConnectionTargetExpression {
139 type Error = ManifestError;
140
141 fn try_from(def: crate::v0::ConnectionTargetDefinition) -> Result<Self> {
142 Ok(ast::ConnectionTargetExpression::new_data(
143 InstanceTarget::from_str(&def.instance)?,
144 InstancePort::named(def.port),
145 def
146 .data
147 .map(|v| v.into_iter().map(|(k, v)| (k, LiquidJsonValue::new(v))).collect()),
148 ))
149 }
150}
151
152impl TryFrom<crate::v0::HostConfig> for config::HostConfig {
153 type Error = ManifestError;
154 fn try_from(def: crate::v0::HostConfig) -> Result<Self> {
155 Ok(Self {
156 allow_latest: def.allow_latest,
157 insecure_registries: def.insecure_registries,
158 rpc: def.rpc.and_then(|v| v.try_into().ok()),
159 })
160 }
161}
162
163impl TryFrom<crate::v0::HttpConfig> for config::HttpConfig {
164 type Error = ManifestError;
165 fn try_from(def: crate::v0::HttpConfig) -> Result<Self> {
166 Ok(Self {
167 enabled: def.enabled,
168 port: def.port,
169 address: opt_str_to_ipv4addr(&def.address)?,
170 pem: match def.pem {
171 Some(v) => Some(v.try_into()?),
172 None => None,
173 },
174 key: match def.key {
175 Some(v) => Some(v.try_into()?),
176 None => None,
177 },
178 ca: match def.ca {
179 Some(v) => Some(v.try_into()?),
180 None => None,
181 },
182 })
183 }
184}