Skip to main content

rusty_cdk_core/cloudwatch/
builder.rs

1use crate::cloudwatch::{LogGroup, LogGroupProperties, LogGroupRef};
2use crate::shared::Id;
3use crate::stack::{Resource, StackBuilder};
4use crate::wrappers::{LogGroupName, RetentionInDays};
5use serde_json::Value;
6
7#[derive(Debug, Clone)]
8pub enum LogGroupClass {
9    Standard,
10    InfrequentAccess,
11}
12
13impl From<LogGroupClass> for String {
14    fn from(value: LogGroupClass) -> Self {
15        match value {
16            LogGroupClass::Standard => "STANDARD".to_string(),
17            LogGroupClass::InfrequentAccess => "INFREQUENT_ACCESS".to_string(),
18        }
19    }
20}
21
22/// Builder for CloudWatch log groups.
23///
24/// # Example
25///
26/// ```rust
27/// use rusty_cdk_core::stack::StackBuilder;
28/// use rusty_cdk_core::cloudwatch::{LogGroupBuilder, LogGroupClass};
29/// use rusty_cdk_core::wrappers::*;
30/// use rusty_cdk_macros::log_group_name;
31///
32/// let mut stack_builder = StackBuilder::new();
33///
34/// let log_group = LogGroupBuilder::new("my-log-group")
35///     .log_group_name_string(log_group_name!("/aws/lambda/my-function"))
36///     .log_group_retention(RetentionInDays(7))
37///     .log_group_class(LogGroupClass::Standard)
38///     .build(&mut stack_builder);
39/// ```
40pub struct LogGroupBuilder {
41    id: Id,
42    log_group_name: Option<Value>,
43    log_group_class: Option<LogGroupClass>,
44    log_group_retention: Option<u16>,
45}
46
47impl LogGroupBuilder {
48    /// Creates a new CloudWatch log group builder.
49    ///
50    /// # Arguments
51    /// * `id` - Unique identifier for the log group
52    pub fn new(id: &str) -> Self {
53        Self {
54            id: Id(id.to_string()),
55            log_group_name: None,
56            log_group_class: None,
57            log_group_retention: None,
58        }
59    }
60
61    pub fn log_group_name_string(self, log_group_name: LogGroupName) -> Self {
62        Self {
63            log_group_name: Some(Value::String(log_group_name.0)),
64            ..self
65        }
66    }
67
68    pub fn log_group_name_value(self, log_group_name: Value) -> Self {
69        Self {
70            log_group_name: Some(log_group_name),
71            ..self
72        }
73    }
74
75    pub fn log_group_class(self, log_group_class: LogGroupClass) -> Self {
76        Self {
77            log_group_class: Some(log_group_class),
78            ..self
79        }
80    }
81
82    pub fn log_group_retention(self, log_group_retention_in_days: RetentionInDays) -> Self {
83        Self {
84            log_group_retention: Some(log_group_retention_in_days.0),
85            ..self
86        }
87    }
88
89    pub fn build(self, stack_builder: &mut StackBuilder) -> LogGroupRef {
90        let properties = LogGroupProperties {
91            log_group_name: self.log_group_name,
92            log_group_class: self.log_group_class.map(Into::into),
93            log_group_retention: self.log_group_retention,
94        };
95
96        let resource_id = Resource::generate_id("LogGroup");
97        
98        stack_builder.add_resource(LogGroup {
99            id: self.id,
100            resource_id: resource_id.clone(),
101            r#type: "AWS::Logs::LogGroup".to_string(),
102            properties,
103        });
104        
105        LogGroupRef::internal_new(resource_id)
106    }
107}