Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add LayerSet::get_or_create_layer #291

Merged
merged 3 commits into from
Mar 10, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion src/layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,14 +144,23 @@ impl LayerSet {
Err(NamingError::Duplicate(name.to_string()))
} else {
let name = Name::new(name).map_err(|_| NamingError::Invalid(name.into()))?;
let path = crate::util::default_file_name_for_layer_name(&name, &self.path_set);
let path = util::default_file_name_for_layer_name(&name, &self.path_set);
let layer = Layer::new(name, path);
self.path_set.insert(layer.path.to_string_lossy().to_lowercase());
self.layers.push(layer);
Ok(self.layers.last_mut().unwrap())
}
}

/// Returns a mutable reference to a layer, by name, creating the layer if it doesn't exist
pub fn get_or_create_layer(&mut self, name: &str) -> Result<&mut Layer, NamingError> {
let index = self.layers.iter().position(|l| l.name.as_str() == name);
match index {
Some(its_here) => Ok(&mut self.layers[its_here]),
None => self.new_layer(name),
}
}

/// Remove a layer.
///
/// The default layer cannot be removed.
Expand Down Expand Up @@ -729,6 +738,36 @@ mod tests {
);
}

#[test]
fn layer_get_or_create() {
let mut ufo = crate::Font::load("testdata/MutatorSansLightWide.ufo").unwrap();
assert_eq!(
ufo.layers.len(),
2,
"number of layers in test data MutatorSansLightWide changed"
);

let result = ufo.layers.get_or_create_layer("background");
assert!(result.is_ok());
assert_eq!(ufo.layers.len(), 2);

let result = ufo.layers.get_or_create_layer("middleground");
assert!(result.is_ok());
assert_eq!(ufo.layers.len(), 3, "new layer wasn't created");
assert!(
ufo.layers.layers.iter().any(|layer| layer.name().as_str() == "foreground"),
"new layer was created with the wrong name"
);

let result = ufo.layers.get_or_create_layer("\t");
assert!(matches!(result, Err(NamingError::Invalid(_))));
assert_eq!(ufo.layers.len(), 3);

let result = ufo.layers.get_or_create_layer(DEFAULT_LAYER_NAME);
assert!(matches!(result, Err(NamingError::ReservedName)));
assert_eq!(ufo.layers.len(), 3);
}

#[test]
fn rename_layer() {
let mut layer_set = LayerSet::default();
Expand Down