Skip to content

Commit 4beaaec

Browse files
committed
normalize desktop to account for broken metadata
1 parent 5e23324 commit 4beaaec

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

src/deserializers.rs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use serde::{Deserialize, Deserializer, de};
2+
use serde_json::Value;
23

34
#[derive(Deserialize)]
45
#[serde(untagged)]
@@ -37,12 +38,38 @@ where
3738
"true" | "yes" | "1" => Ok(Some(true)),
3839
"false" | "no" | "0" => Ok(Some(false)),
3940
"" => Ok(None), // Empty string becomes None
40-
_ => Err(de::Error::invalid_value(
41-
de::Unexpected::Str(&s),
42-
&"a valid boolean (true/false, yes/no, 1/0)",
43-
)),
41+
_ => {
42+
Err(de::Error::invalid_value(
43+
de::Unexpected::Str(&s),
44+
&"a valid boolean (true/false, yes/no, 1/0)",
45+
))
46+
}
4447
}
4548
}
4649
None => Ok(None),
4750
}
4851
}
52+
53+
pub fn normalize_resource<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
54+
where
55+
D: Deserializer<'de>,
56+
{
57+
let v: Option<Value> = Option::deserialize(deserializer)?;
58+
match v {
59+
Some(Value::String(s)) => {
60+
if s.trim().is_empty() {
61+
Ok(None)
62+
} else {
63+
Ok(Some(s))
64+
}
65+
}
66+
Some(Value::Object(map)) => {
67+
if let Some(Value::String(url)) = map.get("url") {
68+
Ok(Some(url.clone()))
69+
} else {
70+
Ok(None)
71+
}
72+
}
73+
_ => Ok(None),
74+
}
75+
}

src/models.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use crate::deserializers::{empty_is_none, flexible_bool, optional_u64};
2-
31
use serde::{Deserialize, Serialize};
42

3+
use crate::deserializers::{empty_is_none, flexible_bool, normalize_resource, optional_u64};
4+
55
#[derive(Debug, Clone, Deserialize, Serialize)]
66
pub enum ProvideStrategy {
77
KeepTargetOnly,
@@ -144,7 +144,7 @@ pub struct RemotePackage {
144144
#[serde(default, deserialize_with = "empty_is_none")]
145145
pub icon: Option<String>,
146146

147-
#[serde(default, deserialize_with = "empty_is_none")]
147+
#[serde(default, deserialize_with = "normalize_resource")]
148148
pub desktop: Option<String>,
149149

150150
#[serde(default, deserialize_with = "empty_is_none")]

0 commit comments

Comments
 (0)