use serde::{Deserialize, Serialize};
use vantage_table::table::Table;
use crate::{AwsAccount, eq};
use super::event::{LogEvent, events_table};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogStream {
#[serde(rename = "logStreamName")]
pub log_stream_name: String,
#[serde(default)]
pub arn: String,
#[serde(rename = "creationTime", default)]
pub creation_time: i64,
#[serde(rename = "firstEventTimestamp", default)]
pub first_event_timestamp: i64,
#[serde(rename = "lastEventTimestamp", default)]
pub last_event_timestamp: i64,
#[serde(rename = "lastIngestionTime", default)]
pub last_ingestion_time: i64,
#[serde(rename = "storedBytes", default)]
pub stored_bytes: i64,
#[serde(rename = "uploadSequenceToken", default)]
pub upload_sequence_token: String,
}
pub fn streams_table(aws: AwsAccount) -> Table<AwsAccount, LogStream> {
Table::new(
"json1/logStreams@nextToken:logs/Logs_20140328.DescribeLogStreams",
aws,
)
.with_id_column("logStreamName")
.with_column_of::<String>("arn")
.with_column_of::<i64>("creationTime")
.with_column_of::<i64>("firstEventTimestamp")
.with_title_column_of::<i64>("lastEventTimestamp")
.with_column_of::<i64>("lastIngestionTime")
.with_title_column_of::<i64>("storedBytes")
.with_column_of::<String>("uploadSequenceToken")
}
impl LogStream {
pub fn from_arn(arn: &str, aws: AwsAccount) -> Option<Table<AwsAccount, LogStream>> {
let after_group = arn.split(":log-group:").nth(1)?;
let (group_name, stream_name) = after_group.split_once(":log-stream:")?;
if group_name.is_empty() || stream_name.is_empty() {
return None;
}
let mut t = streams_table(aws);
t.add_condition(eq("logGroupName", group_name.to_string()));
t.add_condition(eq("logStreamNamePrefix", stream_name.to_string()));
Some(t)
}
pub fn log_group_name(&self) -> Option<&str> {
let after = self.arn.split(":log-group:").nth(1)?;
after.split(":log-stream:").next()
}
pub fn ref_events(&self, aws: AwsAccount) -> Option<Table<AwsAccount, LogEvent>> {
let group = self.log_group_name()?;
Some(self.ref_events_in(aws, group))
}
pub fn ref_events_in(
&self,
aws: AwsAccount,
log_group_name: &str,
) -> Table<AwsAccount, LogEvent> {
let mut t = events_table(aws);
t.add_condition(eq("logGroupName", log_group_name));
t.add_condition(eq("logStreamNamePrefix", self.log_stream_name.clone()));
t
}
}