1use std::fmt;
26use std::marker::PhantomData;
27
28use crate::error::{EncodeError, ProviderError};
29use crate::streaming::UnknownPayload;
30use crate::wire::{
31 Capabilities, Decoder, Descriptor, Flow, Free, Mode, Operation, Out, Wire, WireEvent,
32};
33
34pub struct Local<Op> {
42 name: String,
43 id: Option<String>,
44 capabilities: Capabilities,
45 op: PhantomData<fn() -> Op>,
46}
47
48pub enum Step<Op: Operation> {
50 Event(Op::Event),
52 Unknown(UnknownPayload),
54 End(Op::End),
56}
57
58impl<Op: Operation<Emit = Free>> Local<Op> {
59 pub fn new(name: impl Into<String>) -> Self {
62 Self {
63 name: name.into(),
64 id: None,
65 capabilities: Capabilities::default(),
66 op: PhantomData,
67 }
68 }
69
70 pub fn with_capabilities(mut self, capabilities: Capabilities) -> Self {
72 self.capabilities = capabilities;
73 self
74 }
75
76 pub fn with_id(mut self, id: impl Into<String>) -> Self {
78 self.id = Some(id.into());
79 self
80 }
81}
82
83impl<Op> Clone for Local<Op> {
84 fn clone(&self) -> Self {
85 Self {
86 name: self.name.clone(),
87 id: self.id.clone(),
88 capabilities: self.capabilities,
89 op: PhantomData,
90 }
91 }
92}
93
94impl<Op> fmt::Debug for Local<Op> {
95 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
96 f.debug_struct("Local")
97 .field("name", &self.name)
98 .field("id", &self.id)
99 .field("capabilities", &self.capabilities)
100 .finish()
101 }
102}
103
104impl<Op: Operation<Emit = Free>> Wire for Local<Op> {
105 type Op = Op;
106 type Payload = Op::Request;
107 type Frame = Step<Op>;
108 type Decoder<'id> = Steps;
109 type Reassembler = crate::wire::document::Unreassembled;
110
111 fn describe(&self) -> Descriptor<'_> {
112 Descriptor::new(&self.name)
113 .model(self.id.as_deref())
114 .capabilities(self.capabilities)
115 }
116
117 fn encode(&self, request: Op::Request, _mode: Mode) -> Result<Op::Request, EncodeError> {
118 Ok(request)
119 }
120
121 fn decoder<'id>(&self) -> Self::Decoder<'id> {
122 Steps
123 }
124}
125
126#[derive(Debug, Default)]
128pub struct Steps;
129
130impl<'id, Op: Operation<Emit = Free>> Decoder<'id, Op, Step<Op>> for Steps {
131 type Event = Step<Op>;
132
133 fn classify(&self, step: Step<Op>) -> WireEvent<Step<Op>> {
134 WireEvent::Known(step)
135 }
136
137 fn decode(&mut self, step: Step<Op>, mut out: Out<'id, Op>) -> Result<Flow, ProviderError> {
138 Ok(match step {
139 Step::Event(event) => {
140 out.event(event);
141 Flow::More
142 }
143 Step::Unknown(payload) => {
144 out.unknown(payload);
145 Flow::More
146 }
147 Step::End(end) => out.end(end),
148 })
149 }
150}