fix nested arrays with serde

This commit is contained in:
Robin Appelman 2025-08-17 16:19:47 +02:00
commit 0127eecad2
5 changed files with 230 additions and 47 deletions

94
tests/serde.rs Normal file
View file

@ -0,0 +1,94 @@
use miette::Report;
use php_literal_parser::from_str;
use serde_derive::Deserialize;
#[test]
fn test_parse_struct() {
let code = r#"
['name' => 'Api#get', 'url' => '/api/v{version}/{fileId}', 'verb' => 'GET']
"#;
let result: Route = match from_str(code) {
Ok(result) => result,
Err(error) => {
let error = Report::from(error);
eprintln!("Error while parsing return literal: {error:?}");
panic!();
}
};
assert_eq!(
Route {
name: "Api#get".into(),
url: "/api/v{version}/{fileId}".into(),
verb: "GET".into(),
},
result
);
}
#[test]
fn test_parse_vec_of_structs() {
let code = r#"
[
['name' => 'Api#get', 'url' => '/api/v{version}/{fileId}', 'verb' => 'GET'],
]
"#;
let result: Vec<Route> = match from_str(code) {
Ok(result) => result,
Err(error) => {
let error = Report::from(error);
eprintln!("Error while parsing return literal: {error:?}");
panic!();
}
};
assert_eq!(
vec![Route {
name: "Api#get".into(),
url: "/api/v{version}/{fileId}".into(),
verb: "GET".into(),
}],
result
);
}
#[test]
fn test_parse_struct_of_vecs_of_structs() {
let code = r#"[
'ocs' => [
['name' => 'Api#get', 'url' => '/api/v{version}/{fileId}', 'verb' => 'GET'],
],
]"#;
let result = match from_str(code) {
Ok(result) => result,
Err(error) => {
let error = Report::from(error);
eprintln!("Error while parsing return literal: {error:?}");
panic!();
}
};
assert_eq!(
AppRoutes {
routes: Vec::new(),
ocs: vec![Route {
name: "Api#get".into(),
url: "/api/v{version}/{fileId}".into(),
verb: "GET".into(),
}]
},
result
);
}
#[derive(Default, Debug, Clone, Deserialize, PartialEq)]
pub struct AppRoutes {
#[serde(default)]
routes: Vec<Route>,
#[serde(default)]
ocs: Vec<Route>,
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct Route {
url: String,
name: String,
verb: String,
}