use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Debug)] pub struct PostWomanCollection { pub variables: Vec, // TODO these sure aren't just strings for sure... pub info: CollectionInfo, pub item: Vec, } #[derive(Serialize, Deserialize, Debug)] pub struct CollectionInfo { pub name: String, pub description: String, pub schema: String, pub _postman_id: Option, } #[derive(Serialize, Deserialize, Debug)] pub struct Item { pub name: String, pub event: Option>, pub request: Request, pub response: Vec, // TODO surely isn't just strings } #[derive(Serialize, Deserialize, Debug)] pub struct Event { pub listen: String, pub script: Script, } #[derive(Serialize, Deserialize, Debug)] pub struct Script { pub r#type: String, pub exec: Vec, } #[derive(Serialize, Deserialize, Debug)] pub struct Request { pub url: Url, pub method: String, pub header: Option>, pub body: Option, pub description: Option, } #[derive(Serialize, Deserialize, Debug)] pub struct Header { pub key: String, pub value: String, } #[derive(Serialize, Deserialize, Debug)] #[serde(untagged)] pub enum Body { Json(serde_json::Value), Text(String), } #[derive(Serialize, Deserialize, Debug)] #[serde(untagged)] pub enum Url { Object { raw: Option, protocol: String, host: Vec, path: Vec, query: Option>, variable: Option>, // TODO surely aren't just strings }, String(String), } #[derive(Serialize, Deserialize, Debug)] pub struct Query { pub key: String, pub value: String, pub equals: bool, pub description: Option, } impl ToString for Body { fn to_string(&self) -> String { match self { Body::Json(v) => serde_json::to_string(v).unwrap(), Body::Text(s) => s.clone(), } } } impl ToString for Query { fn to_string(&self) -> String { format!("{}={}", self.key, self.value) } } impl ToString for Url { fn to_string(&self) -> String { match self { Url::String(s) => s.clone(), Url::Object { raw, protocol, host,path, query, variable: _ } => { match &raw { Some(s) => s.clone(), None => { let mut url = String::new(); url.push_str(&protocol); url.push_str("://"); url.push_str(&host.join(".")); url.push_str("/"); url.push_str(&path.join("/")); if let Some(query) = &query { url.push_str("?"); let q : Vec = query.iter().map(|x| x.to_string()).collect(); url.push_str(&q.join("&")); } url } } } } } }