wick_config/v0/
conversions.rs

1use 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}