Diffstat (limited to 'src/protocols.rs')
-rw-r--r--src/protocols.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/protocols.rs b/src/protocols.rs
new file mode 100644
index 0000000..0da527f
--- /dev/null
+++ b/src/protocols.rs
@@ -0,0 +1,59 @@
+pub mod recoverable {
+ use crate::*;
+
+ pub trait Accessor<'value, Err> {
+ /// Each time this is called the walker resets.
+ fn walk_new(&mut self, visitor: &mut dyn Visitor<'value, Err>) -> Result<(), Err>;
+ }
+
+ pub enum Recoverable {}
+
+ impl<'value> Protocol<'value> for Recoverable {
+ type Hint = ();
+
+ type Known = ();
+
+ type Accessor<'walking, Err: Error<'value>> = &'walking dyn Accessor<'value, Err>
+ where
+ 'value: 'walking;
+ }
+}
+
+pub mod str {
+ use crate::*;
+
+ pub enum Kind {
+ Walking,
+ Value,
+ Static,
+ }
+
+ pub struct Hint {
+ pub kind: Option<Kind>,
+ pub min_len: Option<usize>,
+ pub max_len: Option<usize>,
+ }
+
+ pub struct Known {
+ pub kind: Option<Kind>,
+ pub len: Option<usize>,
+ }
+
+ pub enum Data<'walking, 'value> {
+ Walking(&'walking str),
+ Value(&'value str),
+ Static(&'static str),
+ }
+
+ pub enum Str {}
+
+ impl<'value> Protocol<'value> for Str {
+ type Hint = Hint;
+
+ type Known = Known;
+
+ type Accessor<'walking, Err: Error<'value>> = Data<'walking, 'value>
+ where
+ 'value: 'walking;
+ }
+}