Skip to main content

alien_bindings/providers/container/
local.rs

1//! Local container binding implementation
2//!
3//! For containers running in Docker during local development.
4
5use crate::error::Result;
6use crate::traits::{Binding, Container};
7use alien_core::bindings::LocalContainerBinding;
8use async_trait::async_trait;
9
10/// Local Docker container binding implementation
11#[derive(Debug)]
12pub struct LocalContainer {
13    container_name: String,
14    internal_url: String,
15    public_url: Option<String>,
16}
17
18impl LocalContainer {
19    /// Create a new local container binding
20    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}