ploidy_codegen_rust/
cargo.rs1use std::collections::{BTreeMap, BTreeSet};
2
3use cargo_toml::{Edition, Manifest};
4use itertools::Itertools;
5use ploidy_core::codegen::IntoCode;
6use serde::{Deserialize, Serialize};
7
8use super::{config::CodegenConfig, graph::CodegenGraph};
9
10const PLOIDY_VERSION: &str = env!("CARGO_PKG_VERSION");
11
12#[derive(Clone, Debug)]
13pub struct CodegenCargoManifest<'a> {
14 graph: &'a CodegenGraph<'a>,
15 manifest: &'a Manifest<CargoMetadata>,
16}
17
18impl<'a> CodegenCargoManifest<'a> {
19 #[inline]
20 pub fn new(graph: &'a CodegenGraph<'a>, manifest: &'a Manifest<CargoMetadata>) -> Self {
21 Self { graph, manifest }
22 }
23
24 pub fn to_manifest(self) -> Manifest<CargoMetadata> {
25 let mut manifest = self.manifest.clone();
26
27 manifest
29 .package
30 .as_mut()
31 .unwrap()
32 .edition
33 .set(Edition::E2024);
34
35 let features = {
36 let names: BTreeSet<_> = self
37 .graph
38 .operations()
39 .map(|view| view.resource())
40 .filter(|&name| name != "full")
41 .collect();
42 let mut features: BTreeMap<_, _> = names
43 .iter()
44 .map(|&name| (name.to_owned(), vec![]))
45 .collect();
46 features.insert(
47 "full".to_owned(),
48 names.iter().map(|&name| name.to_owned()).collect_vec(),
49 );
50 features.insert("default".to_owned(), vec![]);
51 features
52 };
53
54 let dependencies = toml::toml! {
55 chrono = { version = "0.4", features = ["serde"] }
56 http = "1"
57 ploidy-util = PLOIDY_VERSION
58 reqwest = { version = "0.12", default-features = false, features = ["http2", "json", "multipart", "rustls-tls"] }
59 serde = { version = "1", features = ["derive"] }
60 serde_bytes = "0.11"
61 serde_json = "1"
62 serde_path_to_error = "0.1"
63 thiserror = "2"
64 url = { version = "2.5", features = ["serde"] }
65 uuid = { version = "1", features = ["serde", "v4"] }
66 }.try_into().unwrap();
67
68 Manifest {
69 features,
70 dependencies,
71 ..manifest
72 }
73 }
74}
75
76impl IntoCode for CodegenCargoManifest<'_> {
77 type Code = (&'static str, Manifest<CargoMetadata>);
78
79 fn into_code(self) -> Self::Code {
80 ("Cargo.toml", self.to_manifest())
81 }
82}
83
84#[derive(Clone, Debug, Default, Deserialize, Serialize)]
86pub struct CargoMetadata {
87 #[serde(default)]
88 pub ploidy: Option<CodegenConfig>,
89}