summaryrefslogtreecommitdiffstats
path: root/libimagruby/src/storeid.rs
diff options
context:
space:
mode:
Diffstat (limited to 'libimagruby/src/storeid.rs')
-rw-r--r--libimagruby/src/storeid.rs154
1 files changed, 154 insertions, 0 deletions
diff --git a/libimagruby/src/storeid.rs b/libimagruby/src/storeid.rs
new file mode 100644
index 00000000..a8200649
--- /dev/null
+++ b/libimagruby/src/storeid.rs
@@ -0,0 +1,154 @@
+//
+// imag - the personal information management suite for the commandline
+// Copyright (C) 2015, 2016 Matthias Beyer <mail@beyermatthias.de> and contributors
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; version
+// 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+//
+
+use std::path::PathBuf;
+
+use ruru::{Class, Object, AnyObject, Boolean, RString, NilClass, VerifiedObject};
+
+use libimagstore::storeid::StoreId;
+use util::Unwrap;
+use util::Wrap;
+
+wrappable_struct!(StoreId, StoreIdWrapper, STOREID_WRAPPER);
+class!(RStoreId);
+impl_wrap!(StoreId => STOREID_WRAPPER);
+impl_unwrap!(RStoreId => StoreId => STOREID_WRAPPER);
+impl_verified_object!(RStoreId);
+
+
+methods!(
+ RStoreId,
+ itself,
+
+ fn r_storeid_new(base: RString, id: RString) -> AnyObject {
+ let base = match base.map(|b| b.to_string()).map(PathBuf::from) {
+ Ok(base) => base,
+ Err(e) => {
+ // TODO: Exception!
+ error!("Building StoreId object failed: {:?}", e);
+ return AnyObject::from(NilClass::new().value());
+ },
+ };
+
+ let id = match id.map(|id| id.to_string()).map(PathBuf::from) {
+ Ok(id) => id,
+ Err(e) => {
+ // TODO: Exception!
+ error!("Building StoreId object failed: {:?}", e);
+ return AnyObject::from(NilClass::new().value());
+ },
+ };
+
+ match StoreId::new(Some(base), id) {
+ Ok(sid) => Class::from_existing("RStoreId").wrap_data(sid, &*STOREID_WRAPPER),
+ Err(e) => {
+ // TODO: Exception!
+ error!("Building StoreId object failed: {:?}", e);
+ return AnyObject::from(NilClass::new().value());
+ },
+ }
+ }
+
+ fn r_storeid_new_baseless(id: RString) -> AnyObject {
+ let id = match id.map(|id| id.to_string()).map(PathBuf::from) {
+ Ok(id) => id,
+ Err(e) => {
+ // TODO: Exception!
+ error!("Building StoreId object failed: {:?}", e);
+ return AnyObject::from(NilClass::new().value());
+ },
+ };
+
+ match StoreId::new(None, id) {
+ Ok(sid) => Class::from_existing("RStoreId").wrap_data(sid, &*STOREID_WRAPPER),
+ Err(e) => {
+ // TODO: Exception!
+ error!("Building StoreId object failed: {:?}", e);
+ return AnyObject::from(NilClass::new().value());
+ },
+ }
+ }
+
+ fn r_storeid_without_base() -> RStoreId {
+ let withoutbase : StoreId = itself.get_data(&*STOREID_WRAPPER).clone().without_base();
+ Class::from_existing("RStoreId").wrap_data(withoutbase, &*STOREID_WRAPPER)
+ }
+
+ fn r_storeid_with_base(base: RString) -> AnyObject {
+ let base : PathBuf = match base.map(|b| b.to_string()).map(PathBuf::from) {
+ Ok(pb) => pb,
+ Err(e) => {
+ // TODO: Exception!
+ error!("Error: {:?}", e);
+ return AnyObject::from(NilClass::new().value());
+ },
+ };
+ let withoutbase : StoreId = itself.get_data(&*STOREID_WRAPPER).clone().with_base(base);
+ Class::from_existing("RStoreId").wrap_data(withoutbase, &*STOREID_WRAPPER)
+ }
+
+ fn r_storeid_into_pathbuf() -> AnyObject {
+ itself.get_data(&*STOREID_WRAPPER)
+ .clone()
+ .into_pathbuf()
+ // TODO: No unwraps
+ .map(|pb| pb.to_str().map(String::from).unwrap())
+ .as_ref()
+ .map(|s| AnyObject::from(RString::new(s).value()))
+ // TODO: Exception!
+ .unwrap_or(AnyObject::from(NilClass::new().value()))
+ }
+
+ fn r_storeid_exists() -> Boolean {
+ Boolean::new(itself.get_data(&*STOREID_WRAPPER).exists())
+ }
+
+ fn r_storeid_to_str() -> AnyObject {
+ itself.get_data(&*STOREID_WRAPPER)
+ .to_str()
+ .as_ref()
+ .map(|s| AnyObject::from(RString::new(s).value()))
+ // TODO: Exception!
+ .unwrap_or(AnyObject::from(NilClass::new().value()))
+ }
+
+ fn r_storeid_local() -> RString {
+ let local = itself.get_data(&*STOREID_WRAPPER).local();
+ let local = local.to_str().unwrap(); // TODO: No unwraps
+ RString::new(local)
+ }
+
+);
+
+pub fn setup() -> Class {
+ let mut class = Class::new("RStoreId", None);
+ class.define(|itself| {
+ itself.def_self("new" , r_storeid_new);
+ itself.def_self("new_baseless" , r_storeid_new_baseless);
+
+ itself.def("without_base" , r_storeid_without_base);
+ itself.def("with_base" , r_storeid_with_base);
+ itself.def("into_pathbuf" , r_storeid_into_pathbuf);
+ itself.def("exists" , r_storeid_exists);
+ itself.def("to_str" , r_storeid_to_str);
+ itself.def("local" , r_storeid_local);
+ });
+ class
+}
+