1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::fmt::Debug;

use serde_json::Value;
use tracing::{Level};

pub use filters::EventFilters;
pub use worker::BackgroundWorker;
pub use worker::WorkerMessage;


pub mod filters;
mod worker;
pub mod layer;
mod aws_lambda;

pub type ChannelSender = tokio::sync::mpsc::UnboundedSender<WorkerMessage>;
pub type ChannelReceiver = tokio::sync::mpsc::UnboundedReceiver<WorkerMessage>;

/// Send a message to a webhook endpoint.
pub trait WebhookMessage: Debug + Send + Sync {
    fn webhook_url(&self) -> &str;
    fn serialize(&self) -> String;
}

pub trait WebhookMessageFactory {
    fn create(inputs: WebhookMessageInputs) -> impl WebhookMessage;
}


/// The data expected to be available for message producers.
pub struct WebhookMessageInputs {
    pub app_name: String,
    pub message: String,
    pub target: String,
    pub span: String,
    pub metadata: String,
    pub webhook_url: String,
    pub source_line: u32,
    pub source_file: String,
    pub event_level: Level,
}

#[allow(dead_code)]
#[derive(Clone, Debug)]
pub enum WebhookMessageSpec {
    TextNoEmbed(String),
    TextWithEmbed(String, Vec<Value>),
    EmbedNoText(Vec<Value>),
}

pub trait Config {
    fn webhook_url(&self) -> &str;

    fn new_from_env() -> Self
    where
        Self: Sized;
}

#[cfg(test)]
mod tests {}