use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_with::{DefaultOnError, VecSkipError, serde_as, skip_serializing_none};
use crate::{IntoOption, Meta, SkipListener};
#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct Plan {
#[serde_as(deserialize_as = "DefaultOnError<VecSkipError<_, SkipListener>>")]
pub entries: Vec<PlanEntry>,
#[serde(rename = "_meta")]
pub meta: Option<Meta>,
}
impl Plan {
#[must_use]
pub fn new(entries: Vec<PlanEntry>) -> Self {
Self {
entries,
meta: None,
}
}
#[must_use]
pub fn meta(mut self, meta: impl IntoOption<Meta>) -> Self {
self.meta = meta.into_option();
self
}
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct PlanEntry {
pub content: String,
pub priority: PlanEntryPriority,
pub status: PlanEntryStatus,
#[serde(rename = "_meta")]
pub meta: Option<Meta>,
}
impl PlanEntry {
#[must_use]
pub fn new(
content: impl Into<String>,
priority: PlanEntryPriority,
status: PlanEntryStatus,
) -> Self {
Self {
content: content.into(),
priority,
status,
meta: None,
}
}
#[must_use]
pub fn meta(mut self, meta: impl IntoOption<Meta>) -> Self {
self.meta = meta.into_option();
self
}
}
#[derive(Deserialize, Serialize, JsonSchema, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum PlanEntryPriority {
High,
Medium,
Low,
}
#[derive(Deserialize, Serialize, JsonSchema, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum PlanEntryStatus {
Pending,
InProgress,
Completed,
}