use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
use super::kind::Kind;
use super::status::Status;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Node {
pub id: String,
#[serde(
serialize_with = "serialize_path_forward",
deserialize_with = "deserialize_path"
)]
pub path: PathBuf,
pub title: String,
pub kind: Kind,
pub status: Status,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<NaiveDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated: Option<NaiveDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reviewed: Option<NaiveDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub supersedes: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub superseded_by: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub implements: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub related: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(default)]
pub orphan_ok: bool,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub attrs: BTreeMap<String, serde_json::Value>,
}
pub fn serialize_path_forward<S: serde::Serializer>(path: &Path, s: S) -> Result<S::Ok, S::Error> {
s.serialize_str(&path.to_string_lossy().replace('\\', "/"))
}
pub fn deserialize_path<'de, D: serde::Deserializer<'de>>(d: D) -> Result<PathBuf, D::Error> {
let s = String::deserialize(d)?;
Ok(PathBuf::from(s))
}