mirror of
https://github.com/storytold/figcraft.git
synced 2026-10-28 04:16:46 -06:00
.fig export: warn when a set's variants disagree on a property default
The format keeps one default per property of a set; the first variant's is written (CodeRabbit review on #1152). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
19d6c17b6d
commit
4c6c4d9667
@@ -2002,13 +2002,23 @@ impl<'d> Exporter<'d> {
|
||||
]));
|
||||
}
|
||||
}
|
||||
let mut seen = std::collections::BTreeSet::new();
|
||||
// The format keeps one default per property of a set (a variant's copy holds none): the first
|
||||
// variant's, with a warning when another variant's differs.
|
||||
let mut seen: BTreeMap<String, PropDef> = BTreeMap::new();
|
||||
for v in &variants {
|
||||
let NodeKind::Component { props, .. } = &v.kind else { continue };
|
||||
for (name, d) in props {
|
||||
if prop_type(d).is_some() && seen.insert(name.clone()) {
|
||||
let index = defs.len();
|
||||
defs.extend(self.prop_def(set.id, name, d, index));
|
||||
if prop_type(d).is_none() {
|
||||
continue;
|
||||
}
|
||||
match seen.get(name) {
|
||||
Some(first) if first != d => self.warn("variants with different defaults for one property were written with the first variant's"),
|
||||
Some(_) => {}
|
||||
None => {
|
||||
seen.insert(name.clone(), d.clone());
|
||||
let index = defs.len();
|
||||
defs.extend(self.prop_def(set.id, name, d, index));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1382,3 +1382,14 @@ fn grid_track_sizes_are_written_and_read_back() {
|
||||
assert_eq!(l.column_tracks, columns);
|
||||
assert_eq!(l.row_tracks, vec![GridTrack::fixed(69.0)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn variants_that_disagree_on_a_default_are_a_warning() {
|
||||
let (mut doc, _) = set_with_properties();
|
||||
let large = doc.nodes().find(|n| n.name == "Size=Large").unwrap().id;
|
||||
if let NodeKind::Component { props, .. } = &mut doc.node_mut(large).unwrap().kind {
|
||||
props.insert("Label".into(), PropDef::Text { default: "Large".into() });
|
||||
}
|
||||
let (_, warnings) = export(&doc, None).unwrap();
|
||||
assert!(warnings.iter().any(|w| w.contains("different defaults")), "{warnings:?}");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user