use crate::{events::Event, timestamps::Timestamp};
#[cfg(feature = "fp-bindgen")]
use fp_bindgen::prelude::Serializable;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::BTreeMap;
use typed_builder::TypedBuilder;
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct ProviderEvent {
#[builder(setter(into))]
pub time: Timestamp,
#[builder(default, setter(into, strip_option))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub end_time: Option<Timestamp>,
#[builder(default)]
#[serde(flatten)]
pub otel: OtelMetadata,
#[builder(setter(into))]
pub title: String,
#[builder(default, setter(into, strip_option))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[builder(default, setter(strip_option))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub severity: Option<OtelSeverityNumber>,
#[builder(default)]
pub labels: BTreeMap<String, String>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, TypedBuilder)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct Metric {
pub time: Timestamp,
#[builder(default)]
#[serde(flatten)]
pub otel: OtelMetadata,
pub value: f64,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct OtelMetadata {
pub attributes: BTreeMap<String, Value>,
pub resource: BTreeMap<String, Value>,
#[builder(default, setter(into, strip_option))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trace_id: Option<OtelTraceId>,
#[builder(default, setter(into, strip_option))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub span_id: Option<OtelSpanId>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct OtelSeverityNumber(pub u8);
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct OtelSpanId([u8; 8]);
impl OtelSpanId {
pub fn new(data: [u8; 8]) -> Self {
Self(data)
}
pub fn raw(&self) -> &[u8; 8] {
&self.0
}
}
impl From<[u8; 8]> for OtelSpanId {
fn from(value: [u8; 8]) -> Self {
Self::new(value)
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct OtelTraceId([u8; 16]);
impl OtelTraceId {
pub fn new(data: [u8; 16]) -> Self {
Self(data)
}
pub fn raw(&self) -> &[u8; 16] {
&self.0
}
}
impl From<[u8; 16]> for OtelTraceId {
fn from(value: [u8; 16]) -> Self {
Self::new(value)
}
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize, TypedBuilder)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct Timeline {
pub days: Vec<String>,
pub events_by_day: BTreeMap<String, Vec<Event>>,
#[serde(flatten)]
pub otel: OtelMetadata,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize, TypedBuilder)]
#[cfg_attr(
feature = "fp-bindgen",
derive(Serializable),
fp(rust_module = "fiberplane_models::providers")
)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct Timeseries {
#[builder(setter(into))]
pub name: String,
#[builder(default, setter(into))]
pub labels: BTreeMap<String, String>,
#[builder(default)]
pub metrics: Vec<Metric>,
#[builder(default)]
#[serde(flatten)]
pub otel: OtelMetadata,
#[serde(default)]
pub visible: bool,
}