feat: add server model types and API serialization shape

This commit is contained in:
2026-06-05 15:08:30 +02:00
parent 09f05b8c23
commit 86b196c2d8
4 changed files with 94 additions and 1 deletions
Generated
+4
View File
@@ -468,6 +468,10 @@ dependencies = [
[[package]]
name = "whoareyou-server"
version = "0.1.0"
dependencies = [
"serde",
"serde_json",
]
[[package]]
name = "windows-link"
+2
View File
@@ -5,5 +5,7 @@ edition.workspace = true
authors.workspace = true
[dependencies]
serde = { version = "1", features = ["derive"] }
[dev-dependencies]
serde_json = "1"
+1 -1
View File
@@ -1 +1 @@
// modules added as they are implemented
pub mod model;
+87
View File
@@ -0,0 +1,87 @@
use std::collections::BTreeMap;
use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct Entry {
pub messages: Vec<String>,
pub history: Vec<String>,
pub comments: Vec<Comment>,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct Comment {
/// Unix epoch seconds, UTC.
pub timestamp: Option<i64>,
pub title: Option<String>,
pub message: String,
}
/// Per-provider outcome as exposed in the API (and cached).
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum ProviderResult {
Ok { entry: Entry },
NoData,
FetchFailed,
ParseFailed,
}
/// A fetched HTTP response handed to a provider's `parse`.
#[derive(Debug, Clone)]
pub struct FetchedResponse {
pub status: u16,
pub body: String,
}
/// Outcome of a provider's `parse` call, before API mapping.
#[derive(Debug)]
pub enum ParseOutcome {
Ok(Entry),
NoData,
Failed(String),
}
#[derive(Debug, Serialize)]
pub struct LookupResponse {
pub number: String,
pub results: BTreeMap<String, ProviderResult>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn provider_result_serializes_to_api_shape() {
let ok = ProviderResult::Ok {
entry: Entry {
messages: vec![],
history: vec!["42 andra".to_string()],
comments: vec![Comment {
timestamp: Some(1547746162),
title: None,
message: "Varmsälj".to_string(),
}],
},
};
let json = serde_json::to_value(&ok).unwrap();
assert_eq!(json["status"], "ok");
assert_eq!(json["entry"]["history"][0], "42 andra");
assert_eq!(json["entry"]["comments"][0]["timestamp"], 1547746162);
assert_eq!(
serde_json::to_value(&ProviderResult::NoData).unwrap()["status"],
"no_data"
);
assert_eq!(
serde_json::to_value(&ProviderResult::FetchFailed).unwrap()["status"],
"fetch_failed"
);
assert_eq!(
serde_json::to_value(&ProviderResult::ParseFailed).unwrap()["status"],
"parse_failed"
);
}
}