Add utility for working with file names, port JSON model to use it

This commit is contained in:
Lucien Greathouse
2019-10-09 18:22:58 -07:00
parent e5684ad947
commit 6b620ddcef
3 changed files with 25 additions and 11 deletions

View File

@@ -10,8 +10,8 @@ use crate::{
};
use super::{
error::SnapshotError,
middleware::{SnapshotFileResult, SnapshotInstanceResult, SnapshotMiddleware},
util::match_file_name,
};
pub struct SnapshotJsonModel;
@@ -25,15 +25,8 @@ impl SnapshotMiddleware for SnapshotJsonModel {
return Ok(None);
}
let file_name = entry
.path()
.file_name()
.unwrap()
.to_str()
.ok_or_else(|| SnapshotError::file_name_bad_unicode(entry.path()))?;
let instance_name = match match_trailing(&file_name, ".model.json") {
Some(name) => name.to_owned(),
let instance_name = match match_file_name(entry.path(), ".model.json") {
Some(name) => name,
None => return Ok(None),
};
@@ -58,7 +51,7 @@ impl SnapshotMiddleware for SnapshotJsonModel {
}
}
let mut snapshot = instance.core.into_snapshot(instance_name);
let mut snapshot = instance.core.into_snapshot(instance_name.to_owned());
snapshot.metadata.instigating_source = Some(entry.path().to_path_buf().into());
snapshot.metadata.relevant_paths = vec![entry.path().to_path_buf()];

View File

@@ -16,6 +16,7 @@ mod rbxlx;
mod rbxm;
mod rbxmx;
mod txt;
mod util;
pub use self::error::*;

View File

@@ -0,0 +1,20 @@
use std::path::Path;
/// If the given string ends up with the given suffix, returns the portion of
/// the string before the suffix.
pub fn match_trailing<'a>(input: &'a str, suffix: &str) -> Option<&'a str> {
if input.ends_with(suffix) {
let end = input.len().saturating_sub(suffix.len());
Some(&input[..end])
} else {
None
}
}
/// If the given path has a file name, and that file name ends with the given
/// suffix, returns the portion of the file name before the given suffix.
pub fn match_file_name<'a>(path: &'a Path, suffix: &str) -> Option<&'a str> {
let file_name = path.file_name()?.to_str()?;
match_trailing(&file_name, suffix)
}