chiark / gitweb /
parse scope
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 7 Aug 2020 23:19:15 +0000 (00:19 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 7 Aug 2020 23:19:15 +0000 (00:19 +0100)
src/bin/otter.rs

index 537300ad330ed1f75cfb69f3105a8689e337c0db..13e9ec85933e3253d76ed103803ccb6f31fad8db 100644 (file)
@@ -60,7 +60,9 @@ struct BoundMapStore<'r, T, F: FnMut(&str) -> Result<T,String>> {
 }
 
 impl<'f,T,F> TypedAction<T> for MapStore<T,F>
-where F : 'static + Clone + FnMut(&str) -> Result<T,String> {
+where F : 'f + Clone + FnMut(&str) -> Result<T,String>,
+     'f : 'static // ideally TypedAction wuld have a lifetime parameter
+{
   fn bind<'x>(&self, r: Rc<RefCell<&'x mut T>>) -> Action<'x>
   {
     Action::Single(Box::new(BoundMapStore {
@@ -74,11 +76,11 @@ impl<'x, T, F: FnMut(&str) -> Result<T,String>>
   IArgAction for BoundMapStore<'x, T, F>
 {
   fn parse_arg(&self, arg: &str) -> ParseResult {
-    let v = match self.f.borrow_mut()(arg) {
+    let v : T = match self.f.borrow_mut()(arg) {
       Ok(r) => r,
       Err(e) => return ParseResult::Error(e),
     };
-    *self.r.borrow_mut(arg) = v;
+    **self.r.borrow_mut() = v;
     ParseResult::Parsed
   }
 }
@@ -101,12 +103,14 @@ fn main() {
   {
     use argparse::*;
     let mut ap = ArgumentParser::new();
-    let scope = ap.refer(&mut mainopts.scope);
+    let mut scope = ap.refer(&mut mainopts.scope);
     scope.add_option(&["--scope-server"],
-                     Store(Some(ManagementScope::Server)),
+                     StoreConst(Some(ManagementScope::Server)),
                      "use Server scope");
     scope.add_option(&["--scope-unix-user"],
-                     MapStore(|user| ManagementScope::Unix { user }),
+                     MapStore(|user| Ok(Some(ManagementScope::Unix {
+                       user: user.into()
+                     }))),
                      "use specified unix user scope");
     let r = ap.parse_args();
     mem::drop(ap);