use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::ontology::Residue;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum Schedule {
Once {
run_at: String,
},
Interval {
minutes: f64,
},
Cron {
expr: String,
#[serde(default = "utc")]
tz: String,
},
}
fn utc() -> String {
"UTC".to_string()
}
impl Eq for Schedule {}
impl Schedule {
pub fn kind(&self) -> &'static str {
match self {
Self::Once { .. } => "once",
Self::Interval { .. } => "interval",
Self::Cron { .. } => "cron",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum Target {
Origin,
Home,
Local,
Explicit {
platform: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
chat_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
thread_id: Option<String>,
},
}
impl Target {
pub fn render(&self) -> String {
match self {
Self::Origin => "origin".into(),
Self::Home => "home".into(),
Self::Local => "local".into(),
Self::Explicit {
platform,
chat_id,
thread_id,
} => {
let mut s = platform.clone();
if let Some(c) = chat_id {
s.push(':');
s.push_str(c);
if let Some(t) = thread_id {
s.push(':');
s.push_str(t);
}
}
s
}
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Repeat {
#[serde(default)]
pub times: Option<u32>,
#[serde(default)]
pub completed: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct JobOrigin {
pub platform: String,
#[serde(default)]
pub chat_type: Option<String>,
#[serde(default)]
pub chat_id: Option<String>,
#[serde(default)]
pub thread_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Job {
pub id: String,
pub schedule: Schedule,
#[serde(default)]
pub prompt: Option<String>,
#[serde(default)]
pub workdir: Option<String>,
#[serde(default)]
pub model: Option<String>,
#[serde(default)]
pub skills: Vec<String>,
#[serde(default)]
pub context_from: Option<Vec<String>>,
pub deliver: Target,
#[serde(default)]
pub failure_deliver: Option<Target>,
#[serde(default)]
pub origin: Option<JobOrigin>,
#[serde(default)]
pub attach_to_session: Option<bool>,
#[serde(default)]
pub repeat: Option<Repeat>,
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default)]
pub next_run_at: Option<String>,
#[serde(default)]
pub last_run_at: Option<String>,
#[serde(default)]
pub last_status: Option<String>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub residue: Residue,
}
fn default_true() -> bool {
true
}