use serde::{Deserialize, Serialize};
pub type Gid = String;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UserRef {
pub gid: Gid,
pub name: Option<String>,
pub email: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ResourceRef {
pub gid: Gid,
pub resource_type: Option<String>,
pub name: Option<String>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StatusColor {
#[serde(alias = "on_track")]
Green,
#[serde(alias = "at_risk")]
Yellow,
#[serde(alias = "off_track")]
Red,
#[serde(alias = "on_hold", alias = "complete")]
Blue,
#[default]
None,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DataWrapper<T> {
pub data: T,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListWrapper<T> {
pub data: Vec<T>,
pub next_page: Option<NextPage>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct NextPage {
pub offset: String,
pub path: Option<String>,
pub uri: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_status_color_default() {
assert_eq!(StatusColor::default(), StatusColor::None);
}
#[test]
fn test_deserialize_status_color() {
let green: StatusColor = serde_json::from_str(r#""green""#).unwrap();
assert_eq!(green, StatusColor::Green);
let yellow: StatusColor = serde_json::from_str(r#""yellow""#).unwrap();
assert_eq!(yellow, StatusColor::Yellow);
let on_track: StatusColor = serde_json::from_str(r#""on_track""#).unwrap();
assert_eq!(on_track, StatusColor::Green);
let at_risk: StatusColor = serde_json::from_str(r#""at_risk""#).unwrap();
assert_eq!(at_risk, StatusColor::Yellow);
let off_track: StatusColor = serde_json::from_str(r#""off_track""#).unwrap();
assert_eq!(off_track, StatusColor::Red);
let on_hold: StatusColor = serde_json::from_str(r#""on_hold""#).unwrap();
assert_eq!(on_hold, StatusColor::Blue);
let complete: StatusColor = serde_json::from_str(r#""complete""#).unwrap();
assert_eq!(complete, StatusColor::Blue);
}
#[test]
fn test_deserialize_user_ref() {
let json = r#"{"gid": "123", "name": "Test User", "email": "test@example.com"}"#;
let user: UserRef = serde_json::from_str(json).unwrap();
assert_eq!(user.gid, "123");
assert_eq!(user.name, Some("Test User".to_string()));
assert_eq!(user.email, Some("test@example.com".to_string()));
}
#[test]
fn test_deserialize_data_wrapper() {
let json = r#"{"data": {"gid": "123", "name": "Test"}}"#;
let wrapper: DataWrapper<ResourceRef> = serde_json::from_str(json).unwrap();
assert_eq!(wrapper.data.gid, "123");
}
}