macroonz_compiler/codec/
render.rs1use super::declare::{refusal_conversion, refusal_declaration};
6use super::place::published_module;
7use super::read::decode_road;
8use super::spell::type_path;
9use super::write::encode_road;
10use super::{CodecContent, CodecPlacement, CodecProjection};
11use crate::bounded::Overflow;
12use crate::kind::SoleRole;
13use crate::plan::Plan;
14use crate::render::{Output, RenderError};
15use crate::token::{GeneratedDelimiter, GeneratedToken, GeneratedTree, group};
16
17pub fn render_codec(
25 plan: &Plan<CodecProjection>,
26 out: &mut Output<'_, CodecProjection>,
27) -> Result<(), RenderError> {
28 let tree = codec_surface(plan.content())?;
29 out.unit(SoleRole::Sole, tree)
30}
31
32pub fn codec_surface(content: &CodecContent) -> Result<GeneratedTree, Overflow> {
40 let shape = &content.shape;
41 let reads = content.direction.reads();
42 let mut tokens: Vec<GeneratedToken> = Vec::new();
43 if reads {
44 tokens.extend(refusal_declaration(shape)?);
45 tokens.extend(refusal_conversion(shape)?);
46 }
47 let mut inherent: Vec<GeneratedToken> = Vec::new();
48 if content.direction.writes() {
49 inherent.extend(encode_road(shape)?);
50 }
51 if reads {
52 inherent.extend(decode_road(shape)?);
53 }
54 tokens.push(GeneratedToken::word("impl"));
55 tokens.extend(type_path(shape.owner()));
56 tokens.push(group(GeneratedDelimiter::Brace, inherent)?);
57 let placed = match &content.placement {
58 CodecPlacement::AtDeclarationSite => tokens,
59 CodecPlacement::PublishedModule { spelling } => {
60 published_module(spelling.spelling(), tokens)?
61 }
62 };
63 GeneratedTree::assembled(placed)
64}