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::{GeneratedToken, GeneratedTree, implementation};
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.extend(implementation(
55 Vec::new(),
56 Vec::new(),
57 None,
58 type_path(shape.owner()),
59 Vec::new(),
60 inherent,
61 )?);
62 let placed = match &content.placement {
63 CodecPlacement::AtDeclarationSite => tokens,
64 CodecPlacement::PublishedModule { spelling } => {
65 published_module(spelling.spelling(), tokens)?
66 }
67 };
68 GeneratedTree::assembled(placed)
69}