Skip to content

Commit 952b800

Browse files
Merge pull request #9 from facet-rs/default-from-struct
fix: Re-implement 'get field values from Default struct'
2 parents f6df574 + b2d6c9d commit 952b800

File tree

4 files changed

+25
-19
lines changed

4 files changed

+25
-19
lines changed

Cargo.lock

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ log = ["dep:log"]
2121

2222
[dependencies]
2323
yaml-rust2 = "0.10.3"
24-
facet-core = { version = "0.29", default-features = false }
25-
facet-reflect = { version = "0.29", default-features = false }
24+
facet-core = { version = "0.29.1", default-features = false }
25+
facet-reflect = { version = "0.29.1", default-features = false }
2626
facet-serialize = { version = "0.29", default-features = false, optional = true }
2727
log = { version = "0.4.27", optional = true }
2828

2929
[dev-dependencies]
30-
facet = { version = "0.29" }
30+
facet = { version = "0.29.1" }
3131
eyre = "0.6.12"
3232
ulid = "1.2.1"
3333
time = { version = "0.3.41", features = ["macros", "parsing", "formatting"] }

src/deserialize/mod.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,19 @@ fn deserialize_value<'facet>(wip: &mut Partial<'facet>, value: &Yaml) -> Result<
127127
}
128128
}
129129

130+
let mut default_instance: Option<Partial> = None;
131+
130132
for (index, _field) in sd.fields.iter().enumerate() {
131133
let is_set = wip.is_field_set(index).map_err(|e| AnyErr(e.to_string()))?;
132134
if !is_set {
133-
todo!(
134-
"should fill unset fields from struct's Default, but not implemented yet. the previous implementation was unsound."
135-
)
135+
let default_instance_mut = default_instance.get_or_insert_with(|| {
136+
// FIXME: those unwrap() don't look good
137+
let mut partial = Partial::alloc_shape(shape).unwrap();
138+
// FIXME: this'll blow up if the struct itself doesn't impl Default
139+
partial.set_default().unwrap();
140+
partial
141+
});
142+
wip.steal_nth_field(default_instance_mut, index)?;
136143
}
137144
}
138145
} else {

tests/deserialize/default.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use facet::Facet;
22
use facet_testhelpers::test;
33

44
#[test]
5-
#[ignore]
65
fn test_struct_level_default() {
76
#[derive(Facet, Default, Debug, PartialEq)]
87
#[facet(default)]

0 commit comments

Comments
 (0)