alien_bindings/providers/container/
local.rs1use crate::error::Result;
6use crate::traits::{Binding, Container};
7use alien_core::bindings::LocalContainerBinding;
8use async_trait::async_trait;
9
10#[derive(Debug)]
12pub struct LocalContainer {
13 container_name: String,
14 internal_url: String,
15 public_url: Option<String>,
16}
17
18impl LocalContainer {
19 pub fn new(binding: LocalContainerBinding) -> Result<Self> {
21 use crate::error::ErrorData;
22 use alien_error::Context;
23
24 let container_name = binding
25 .container_name
26 .into_value("container", "container_name")
27 .context(ErrorData::BindingConfigInvalid {
28 binding_name: "container".to_string(),
29 reason: "Failed to resolve container_name from binding".to_string(),
30 })?;
31
32 let internal_url = binding
33 .internal_url
34 .into_value("container", "internal_url")
35 .context(ErrorData::BindingConfigInvalid {
36 binding_name: "container".to_string(),
37 reason: "Failed to resolve internal_url from binding".to_string(),
38 })?;
39
40 let public_url = binding
41 .public_url
42 .map(|v| {
43 v.into_value("container", "public_url")
44 .context(ErrorData::BindingConfigInvalid {
45 binding_name: "container".to_string(),
46 reason: "Failed to resolve public_url from binding".to_string(),
47 })
48 })
49 .transpose()?;
50
51 Ok(Self {
52 container_name,
53 internal_url,
54 public_url,
55 })
56 }
57}
58
59impl Binding for LocalContainer {}
60
61#[async_trait]
62impl Container for LocalContainer {
63 fn get_internal_url(&self) -> &str {
64 &self.internal_url
65 }
66
67 fn get_public_url(&self) -> Option<&str> {
68 self.public_url.as_deref()
69 }
70
71 fn get_container_name(&self) -> &str {
72 &self.container_name
73 }
74
75 fn as_any(&self) -> &dyn std::any::Any {
76 self
77 }
78}