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