ploidy_codegen_rust/
lib.rs1use 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
70pub 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}