iQIcBAABCgAGBQJWomPqAAoJEN1O030MrHbiYEEQALGQfJYEfbCgvVejgiwOKMjv
m7U7nEQbMMVYHVbeCdUs2PXHwCFr8slSccyWoF0QNHX4/Tx5t+XJ9JnRsyIhQyzi UWRQo3mHDErn2lP+M+4kfDWPpOdJicJKAxyiLgGo/Aw5CblX9MAaKfE85rZh7atx JM567tN+O/Cflt676Mva3xnzpisHFKVJKG58k+QzmZOgNtROWg3PTyAb+/T2c6Vd Ty+zW4zt7LwKjGlK9YEDqEwpg3STKUPT9T5S6ZFkPHBbjPVtM5yXK1oTWOpE7zn+ iXSjCqfC2Ok+MT9YB1loexY2f6bzwqZkmWHl3M+4f1fJfhBQR0Zdz4a/hyp2YLcv hVW/X/AeVCdoMOBZ9PCaFjY6aXFycB6HlDDU1jldCN5U08BfY+h6hDtW5xaPLj2s WWeyIZgnqLJsGk7VK+/KAdDZMAZVwoC69AVXQS+IjejetQWHY5OFhCBfRVZ02/aX jwdZSfw5oNCGsvrzknkcECL9bPQAGRptoLbGuuLNPaACNd8ebWTmw4gwxFYwwAGY Dq6NDA33S3uRDvK24MpUA8g5OxsU8kzblhP6iYqGTg0dLnGFRzioKDg3v7NFKN9/ Yy7g1uQCZIVbrVnZF6w68jfuX6IoIHWl6eg6De2AmMNClYGZflDzbSoYCZkiz1d4 AR6HHXLT84nAJ2tCgK0S =6TMR -----END PGP SIGNATURE----- Add macro to create ModuleEntryPath
This commit is contained in:
parent
a85d658f33
commit
560e7106f8
4 changed files with 78 additions and 73 deletions
|
@ -1,6 +1,6 @@
|
|||
use header::EntryHeader;
|
||||
use content::EntryContent;
|
||||
use store::StoreId;
|
||||
use storeid::StoreId;
|
||||
|
||||
/**
|
||||
* An Entry of the store
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
extern crate fs2;
|
||||
extern crate toml;
|
||||
extern crate tempdir;
|
||||
extern crate semver;
|
||||
|
||||
pub mod storeid;
|
||||
pub mod content;
|
||||
pub mod entry;
|
||||
pub mod error;
|
||||
|
|
|
@ -10,58 +10,11 @@ use fs2::FileExt;
|
|||
|
||||
use entry::Entry;
|
||||
use error::{StoreError, StoreErrorKind};
|
||||
use storeid::StoreId;
|
||||
|
||||
/// The Result Type returned by any interaction with the store that could fail
|
||||
pub type Result<T> = RResult<T, StoreError>;
|
||||
|
||||
/// The Index into the Store
|
||||
pub type StoreId = PathBuf;
|
||||
|
||||
/// This Trait allows you to convert various representations to a single one
|
||||
/// suitable for usage in the Store
|
||||
trait IntoStoreId {
|
||||
fn into_storeid(self) -> StoreId;
|
||||
}
|
||||
|
||||
impl<'a> IntoStoreId for &'a str {
|
||||
fn into_storeid(self) -> StoreId {
|
||||
PathBuf::from(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> IntoStoreId for &'a String{
|
||||
fn into_storeid(self) -> StoreId {
|
||||
PathBuf::from(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl IntoStoreId for String{
|
||||
fn into_storeid(self) -> StoreId {
|
||||
PathBuf::from(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl IntoStoreId for PathBuf {
|
||||
fn into_storeid(self) -> StoreId {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> IntoStoreId for &'a PathBuf {
|
||||
fn into_storeid(self) -> StoreId {
|
||||
self.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl<ISI: IntoStoreId> IntoStoreId for (ISI, ISI) {
|
||||
fn into_storeid(self) -> StoreId {
|
||||
let (first, second) = self;
|
||||
let mut res : StoreId = first.into_storeid();
|
||||
res.push(second.into_storeid());
|
||||
res
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq)]
|
||||
enum StoreEntryPresence {
|
||||
Present,
|
||||
|
@ -220,27 +173,3 @@ impl<'a> Drop for FileLockEntry<'a> {
|
|||
self.store._update(self).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use std::path::PathBuf;
|
||||
use store::{StoreId, IntoStoreId};
|
||||
|
||||
#[test]
|
||||
fn into_storeid_trait() {
|
||||
let buf = PathBuf::from("abc/def");
|
||||
|
||||
let test = ("abc", "def");
|
||||
assert_eq!(buf, test.into_storeid());
|
||||
|
||||
let test = "abc/def";
|
||||
assert_eq!(buf, test.into_storeid());
|
||||
|
||||
let test = String::from("abc/def");
|
||||
assert_eq!(buf, test.into_storeid());
|
||||
|
||||
let test = PathBuf::from("abc/def");
|
||||
assert_eq!(buf, test.into_storeid());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
74
libimagstore/src/storeid.rs
Normal file
74
libimagstore/src/storeid.rs
Normal file
|
@ -0,0 +1,74 @@
|
|||
use std::path::PathBuf;
|
||||
|
||||
/// The Index into the Store
|
||||
pub type StoreId = PathBuf;
|
||||
|
||||
/// This Trait allows you to convert various representations to a single one
|
||||
/// suitable for usage in the Store
|
||||
trait IntoStoreId {
|
||||
fn into_storeid(self) -> StoreId;
|
||||
}
|
||||
|
||||
impl IntoStoreId for PathBuf {
|
||||
fn into_storeid(self) -> StoreId {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! module_entry_path_mod {
|
||||
($name:expr, $version:expr) => (
|
||||
pub mod module_path {
|
||||
use semver::Version;
|
||||
use std::convert::AsRef;
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
|
||||
/// A Struct giving you the ability to choose store entries assigned
|
||||
/// to it.
|
||||
///
|
||||
/// It is created through a call to `new`.
|
||||
pub struct ModuleEntryPath(PathBuf);
|
||||
|
||||
impl ModuleEntryPath {
|
||||
/// Path has to be a valid UTF-8 string or this will panic!
|
||||
pub fn new<P: AsRef<Path>>(pa: P) -> ModuleEntryPath {
|
||||
let mut path = PathBuf::new();
|
||||
path.push(format!("/{}", $name));
|
||||
path.push(pa.as_ref().clone());
|
||||
let version = Version::parse($version).unwrap();
|
||||
let name = pa.as_ref().file_name().unwrap()
|
||||
.to_str().unwrap();
|
||||
path.set_file_name(format!("{}~{}",
|
||||
name,
|
||||
version));
|
||||
ModuleEntryPath(path)
|
||||
}
|
||||
}
|
||||
|
||||
impl $crate::storeid::IntoStoreId for ModuleEntryPath {
|
||||
fn into_storeid(mut self) -> $crate::storeid::StoreId {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
|
||||
use storeid::IntoStoreId;
|
||||
|
||||
module_entry_path_mod!("test", "0.2.0-alpha+leet1337");
|
||||
|
||||
#[test]
|
||||
fn correct_path() {
|
||||
let p = module_path::ModuleEntryPath::new("test");
|
||||
|
||||
assert_eq!(p.into_storeid().to_str().unwrap(),
|
||||
"/test/test~0.2.0-alpha+leet1337");
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue