use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub type TransitionName = String;
pub type StateName = String;
pub type ResourceKind = String;
#[derive(Debug, Default, Clone)]
pub struct TransitionInput {
pub fields: BTreeMap<String, Value>,
}
impl TransitionInput {
pub fn get(&self, name: &str) -> Option<&Value> {
self.fields.get(name)
}
pub fn get_str(&self, name: &str) -> Option<&str> {
self.fields.get(name).and_then(Value::as_str)
}
}
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum StreamKind {
#[default]
Object,
Binary,
}
#[derive(Debug, Default, Clone)]
pub struct StreamSpec {
pub name: String,
pub kind: StreamKind,
}
#[derive(Debug, Clone)]
pub struct FieldSpec {
pub name: String,
pub type_: String,
pub title: Option<String>,
pub value: Option<Value>,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum TransitionResultKind {
#[default]
Sync,
AsyncJob,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum Idempotency {
#[default]
None,
Supported,
Required,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum Effect {
Safe,
UnsafeIdempotent,
#[default]
Unsafe,
}
#[derive(Debug, Default, Clone)]
pub struct TransitionSpec {
pub name: TransitionName,
pub title: Option<String>,
pub allowed_states: Vec<StateName>,
pub input_schema: Option<Value>,
pub output_schema: Option<Value>,
pub result: TransitionResultKind,
pub idempotency: Idempotency,
pub effect: Effect,
pub required_scopes: Vec<String>,
pub fields: Vec<FieldSpec>,
}
#[derive(Debug, Default, Clone)]
pub struct ResourceSpec {
pub kind: ResourceKind,
pub name: Option<String>,
pub labels: BTreeMap<String, String>,
pub property_schema: Option<Value>,
pub streams: Vec<StreamSpec>,
}
#[derive(Debug, Default, Clone)]
pub struct ActorSpec {
pub resource: ResourceSpec,
pub transitions: Vec<TransitionSpec>,
}