From 6b620ddceff461dcb3d70bd41e5c759765ca5030 Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Wed, 9 Oct 2019 18:22:58 -0700 Subject: [PATCH] Add utility for working with file names, port JSON model to use it --- src/snapshot_middleware/json_model.rs | 15 ++++----------- src/snapshot_middleware/mod.rs | 1 + src/snapshot_middleware/util.rs | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 src/snapshot_middleware/util.rs diff --git a/src/snapshot_middleware/json_model.rs b/src/snapshot_middleware/json_model.rs index 65f90d77..4725545b 100644 --- a/src/snapshot_middleware/json_model.rs +++ b/src/snapshot_middleware/json_model.rs @@ -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()]; diff --git a/src/snapshot_middleware/mod.rs b/src/snapshot_middleware/mod.rs index d8cfa355..a31fdb10 100644 --- a/src/snapshot_middleware/mod.rs +++ b/src/snapshot_middleware/mod.rs @@ -16,6 +16,7 @@ mod rbxlx; mod rbxm; mod rbxmx; mod txt; +mod util; pub use self::error::*; diff --git a/src/snapshot_middleware/util.rs b/src/snapshot_middleware/util.rs new file mode 100644 index 00000000..153c31c2 --- /dev/null +++ b/src/snapshot_middleware/util.rs @@ -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) +}