#![allow(clippy::needless_for_each)]
#![allow(unused_crate_dependencies)]
use stately::prelude::*;
#[stately::entity]
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct Pipeline {
pub name: String,
pub source: Link<Source>,
}
#[stately::entity]
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct Source {
pub name: String,
pub url: String,
}
#[stately::entity]
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct Sink {
pub name: String,
pub destination: String,
}
type SinkCollection = Collection<Sink>;
#[stately::state(openapi)]
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
pub struct State {
pipelines: Pipeline,
sources: Source,
#[collection(variant = "ArchivedPipeline")]
archived: Pipeline,
#[collection(SinkCollection)]
sinks: Sink,
#[collection(foreign, variant = "JsonConfig")]
configs: serde_json::Value,
}
impl ForeignEntity for serde_json::Value {
fn name(&self) -> &str { self.get("name").and_then(|v| v.as_str()).unwrap_or("unnamed") }
fn description(&self) -> Option<&str> { self.get("description").and_then(|v| v.as_str()) }
}
#[stately::axum_api(State, openapi(components = [
link_aliases::PipelineLink,
link_aliases::SourceLink,
link_aliases::ArchivedPipelineLink,
link_aliases::SinkLink,
link_aliases::JsonConfigLink,
]))]
pub struct ApiState {}
fn main() {
let _state = State::new();
println!("State created with {} collections", 5);
}