Skip to main content

rusty_cdk_core/cloudwatch/
builder.rs

1use crate::cloudwatch::{LogGroup, LogGroupProperties, LogGroupRef, LogGroupType};
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/// See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html
25/// # Example
26///
27/// ```rust
28/// use rusty_cdk_core::stack::StackBuilder;
29/// use rusty_cdk_core::cloudwatch::{LogGroupBuilder, LogGroupClass};
30/// use rusty_cdk_core::wrappers::*;
31/// use rusty_cdk_macros::log_group_name;
32///
33/// let mut stack_builder = StackBuilder::new();
34///
35/// let log_group = LogGroupBuilder::new("my-log-group")
36///     .log_group_name_string(log_group_name!("/aws/lambda/my-function"))
37///     .log_group_retention(RetentionInDays(7))
38///     .log_group_class(LogGroupClass::Standard)
39///     .build(&mut stack_builder);
40/// ```
41pub struct LogGroupBuilder {
42    id: Id,
43    log_group_name: Option<Value>,
44    log_group_class: Option<LogGroupClass>,
45    log_group_retention: Option<u16>,
46}
47
48impl LogGroupBuilder {
49    /// Creates a new CloudWatch log group builder.
50    ///
51    /// # Arguments
52    /// * `id` - Unique identifier for the log group
53    pub fn new(id: &str) -> Self {
54        Self {
55            id: Id(id.to_string()),
56            log_group_name: None,
57            log_group_class: None,
58            log_group_retention: None,
59        }
60    }
61
62    pub fn log_group_name_string(self, log_group_name: LogGroupName) -> Self {
63        Self {
64            log_group_name: Some(Value::String(log_group_name.0)),
65            ..self
66        }
67    }
68
69    pub fn log_group_class(self, log_group_class: LogGroupClass) -> Self {
70        Self {
71            log_group_class: Some(log_group_class),
72            ..self
73        }
74    }
75
76    pub fn log_group_retention(self, log_group_retention_in_days: RetentionInDays) -> Self {
77        Self {
78            log_group_retention: Some(log_group_retention_in_days.0),
79            ..self
80        }
81    }
82
83    pub fn build(self, stack_builder: &mut StackBuilder) -> LogGroupRef {
84        let properties = LogGroupProperties {
85            log_group_name: self.log_group_name,
86            log_group_class: self.log_group_class.map(Into::into),
87            log_group_retention: self.log_group_retention,
88        };
89
90        let resource_id = Resource::generate_id("LogGroup");
91        
92        stack_builder.add_resource(LogGroup {
93            id: self.id,
94            resource_id: resource_id.clone(),
95            r#type: LogGroupType::LogGroupType,
96            properties,
97        });
98        
99        LogGroupRef::internal_new(resource_id)
100    }
101}