ploidy_codegen_rust/
lib.rs

1use std::{collections::BTreeMap, path::Path};
2
3use itertools::Itertools;
4use proc_macro2::TokenStream;
5use quote::quote;
6
7use ploidy_core::codegen::{IntoCode, write_to_disk};
8
9mod cargo;
10mod client;
11mod derives;
12mod enum_;
13mod graph;
14mod naming;
15mod operation;
16mod ref_;
17mod resource;
18mod schema;
19mod statics;
20mod struct_;
21mod tagged;
22mod types;
23mod untagged;
24
25#[cfg(test)]
26mod tests;
27
28pub use cargo::*;
29pub use client::*;
30pub use graph::*;
31pub use naming::*;
32pub use operation::*;
33pub use resource::*;
34pub use schema::*;
35pub use statics::*;
36pub use types::*;
37
38pub fn write_types_to_disk(output: &Path, graph: &CodegenGraph<'_>) -> miette::Result<()> {
39    for view in graph.schemas() {
40        let code = CodegenSchemaType::new(&view).into_code();
41        write_to_disk(output, code)?;
42    }
43
44    write_to_disk(output, CodegenTypesModule::new(graph))?;
45
46    Ok(())
47}
48
49pub fn write_client_to_disk(output: &Path, graph: &CodegenGraph<'_>) -> miette::Result<()> {
50    let by_resource = graph
51        .operations()
52        .fold(BTreeMap::<_, Vec<_>>::new(), |mut map, view| {
53            let resource = view.resource();
54            map.entry(resource).or_default().push(view);
55            map
56        });
57
58    for (resource, operations) in &by_resource {
59        let code = CodegenResource::new(resource, operations);
60        write_to_disk(output, code)?;
61    }
62
63    let resources = by_resource.keys().copied().collect_vec();
64    let mod_code = CodegenClientModule::new(graph, &resources);
65    write_to_disk(output, mod_code)?;
66
67    Ok(())
68}
69
70/// Generates one or more `#[doc]` attributes for a schema description,
71/// wrapping at 80 characters for readability.
72pub fn doc_attrs(description: &str) -> TokenStream {
73    let lines = textwrap::wrap(description, 80)
74        .into_iter()
75        .map(|line| quote!(#[doc = #line]));
76    quote! { #(#lines)* }
77}