usecrate::{Path as PathName, Interface as IfaceName, Member as MemberName, Signature, Message}; use std::borrow::Cow; use std::collections::BTreeMap; use std::any::Any; use std::mem; usecrate::arg::{Arg, Append, Get, ArgBuilder, TypeMismatchError, IterAppend}; use std::marker::PhantomData; usesuper::MethodErr; usesuper::handlers::{Handlers, DebugMethod, DebugProp, Par, ParInfo, Mut, MutCtx}; usesuper::crossroads::{Crossroads, PathData};
fn build_argvec<A: ArgBuilder>(a: A::strs) -> Vec<Argument<'static>> { letmut v = vec!();
A::strs_sig(a, |name, sig| {
v.push(Argument { name: name.into(), sig })
});
v
}
#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)] /// Enumerates the different signaling behaviors a Property can have /// to being changed. pubenum EmitsChangedSignal { /// The Property emits a signal that includes the new value. True, /// The Property emits a signal that does not include the new value.
Invalidates, /// The Property cannot be changed. Const, /// The Property does not emit a signal when changed. False,
}
#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)] /// The possible access characteristics a Property can have. pubenum Access { /// The Property can only be read (Get).
Read, /// The Property can be read or written.
ReadWrite, /// The Property can only be written (Set).
Write,
}
pubfn signal<A: ArgBuilder, N: Into<MemberName<'static>>>(mut self, name: N, args: A::strs) -> Self { let s = SignalInfo { name: name.into(), args: build_argvec::<A>(args), anns: Default::default() }; self.info.signals.push(s); self
}
}
impl<'a, I: 'static, H: Handlers> Drop for IfaceInfoBuilder<'a, I, H> { fn drop(&mutself) { iflet Some(refmut cr) = self.cr { let info = IfaceInfo::new_empty(self.info.name.clone()); // workaround for not being able to consume self.info
cr.register_custom::<I>(mem::replace(&mutself.info, info));
}
}
}
impl<'a, I: 'static> IfaceInfoBuilder<'a, I, Par> { pubfn method<IA: ArgBuilder, OA: ArgBuilder, N, F>(mutself, name: N, in_args: IA::strs, out_args: OA::strs, f: F) -> Self where N: Into<MemberName<'static>>, F: Fn(&I, &ParInfo, IA) -> Result<OA, MethodErr> + Send + Sync + 'static { let f: <Par as Handlers>::Method = Box::new(move |data, info| { let iface: &I = data.downcast_ref().unwrap(); let r = IA::read(info.msg()).map_err(From::from); let r = r.and_then(|ia| f(iface, info, ia)); match r {
Err(e) => Some(e.to_message(info.msg())),
Ok(r) => { letmut m = info.msg().method_return();
OA::append(r, &mut m);
Some(m)
},
}
});
let m = MethodInfo { name: name.into(), handler: DebugMethod(f),
i_args: build_argvec::<IA>(in_args), o_args: build_argvec::<OA>(out_args), anns: Default::default() }; self.info.methods.push(m); self
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.