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::{binding_env_var, 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                env_var: binding_env_var("container"),
29                binding_name: "container".to_string(),
30                reason: "Failed to resolve container_name from binding".to_string(),
31            })?;
32
33        let internal_url = binding
34            .internal_url
35            .into_value("container", "internal_url")
36            .context(ErrorData::BindingConfigInvalid {
37                env_var: binding_env_var("container"),
38                binding_name: "container".to_string(),
39                reason: "Failed to resolve internal_url from binding".to_string(),
40            })?;
41
42        let public_url = binding
43            .public_url
44            .map(|v| {
45                v.into_value("container", "public_url")
46                    .context(ErrorData::BindingConfigInvalid {
47                        env_var: binding_env_var("container"),
48                        binding_name: "container".to_string(),
49                        reason: "Failed to resolve public_url from binding".to_string(),
50                    })
51            })
52            .transpose()?;
53
54        Ok(Self {
55            container_name,
56            internal_url,
57            public_url,
58        })
59    }
60}
61
62impl Binding for LocalContainer {}
63
64#[async_trait]
65impl Container for LocalContainer {
66    fn get_internal_url(&self) -> &str {
67        &self.internal_url
68    }
69
70    fn get_public_url(&self) -> Option<&str> {
71        self.public_url.as_deref()
72    }
73
74    fn get_container_name(&self) -> &str {
75        &self.container_name
76    }
77
78    fn as_any(&self) -> &dyn std::any::Any {
79        self
80    }
81}