diff --git a/src/analyzer.rs b/src/analyzer.rs index ce9bb33..e487fa9 100644 --- a/src/analyzer.rs +++ b/src/analyzer.rs @@ -1,5 +1,5 @@ //! Deals entirely with schema analysis for the purpose of creating output structs + members -use crate::{OutputMember, OutputStruct, Output}; +use crate::{Container, Member, Output}; use anyhow::{bail, Result}; use k8s_openapi::apiextensions_apiserver::pkg::apis::apiextensions::v1::{ JSONSchemaProps, JSONSchemaPropsOrArray, JSONSchemaPropsOrBool, JSON, @@ -30,7 +30,7 @@ fn analyze_( current: &str, stack: &str, level: u8, - results: &mut Vec, + results: &mut Vec, ) -> Result<()> { let props = schema.properties.clone().unwrap_or_default(); let mut array_recurse_level: HashMap = Default::default(); @@ -148,7 +148,7 @@ fn analyze_enum_properties( stack: &str, level: u8, schema: &JSONSchemaProps, -) -> Result { +) -> Result { let mut members = vec![]; debug!("analyzing enum {}", serde_json::to_string(&schema).unwrap()); for en in items { @@ -161,14 +161,14 @@ fn analyze_enum_properties( // Create member and wrap types correctly let member_doc = None; debug!("with enum member {} of type {}", name, rust_type); - members.push(OutputMember { + members.push(Member { type_: rust_type, name: name.to_string(), serde_annot: vec![], docs: member_doc, }) } - Ok(OutputStruct { + Ok(Container { name: stack.to_string(), members, level, @@ -185,7 +185,7 @@ fn analyze_object_properties( array_recurse_level: &mut HashMap, level: u8, schema: &JSONSchemaProps, -) -> Result, anyhow::Error> { +) -> Result, anyhow::Error> { let mut results = vec![]; let mut members = vec![]; //debug!("analyzing object {}", serde_json::to_string(&schema).unwrap()); @@ -304,7 +304,7 @@ fn analyze_object_properties( let member_doc = value.description.clone(); if reqs.contains(key) { debug!("with required member {} of type {}", key, &rust_type); - members.push(OutputMember { + members.push(Member { type_: rust_type, name: key.to_string(), serde_annot: vec![], @@ -313,7 +313,7 @@ fn analyze_object_properties( } else { // option wrapping needed if not required debug!("with optional member {} of type {}", key, rust_type); - members.push(OutputMember { + members.push(Member { type_: format!("Option<{}>", rust_type), name: key.to_string(), serde_annot: vec![ @@ -328,7 +328,7 @@ fn analyze_object_properties( // probably better to do impl Default to avoid having to make custom fns } } - results.push(OutputStruct { + results.push(Container { name: stack.to_string(), members, level, diff --git a/src/lib.rs b/src/lib.rs index 445090c..e3bf120 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,7 @@ mod analyzer; pub use analyzer::analyze; mod output; -pub use output::{OutputMember, OutputStruct, Output}; +pub use output::{Container, Member, Output}; // synced from https://doc.rust-lang.org/reference/keywords.html feb 2022 pub const KEYWORDS: [&str; 52] = [ diff --git a/src/main.rs b/src/main.rs index 665b11c..409bd4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ use anyhow::{anyhow, Context, Result}; use k8s_openapi::apiextensions_apiserver::pkg::apis::apiextensions::v1::{ CustomResourceDefinition, CustomResourceDefinitionVersion, CustomResourceSubresources, }; -use kopium::{analyze, OutputStruct, KEYWORDS}; +use kopium::{analyze, Container, KEYWORDS}; use kube::{api, core::Version, Api, Client, ResourceExt}; use quote::format_ident; use std::path::PathBuf; @@ -318,7 +318,7 @@ impl Kopium { println!("#[derive({})]", derives.join(", ")); } - fn print_prelude(&self, results: &[OutputStruct]) { + fn print_prelude(&self, results: &[Container]) { if !self.rust_case && !self.hide_inner_attr { println!("#![allow(non_snake_case)]"); // NB: we cannot allow warnings for bad enum names see #69 diff --git a/src/output.rs b/src/output.rs index a0eb2cd..920c411 100644 --- a/src/output.rs +++ b/src/output.rs @@ -1,26 +1,26 @@ -use heck::{ToSnakeCase, ToPascalCase}; +use heck::{ToPascalCase, ToSnakeCase}; /// All found containers -pub struct Output(pub Vec); +pub struct Output(pub Vec); /// Output container found by analyzer #[derive(Default, Debug)] -pub struct OutputStruct { +pub struct Container { /// The short name of the struct (kind + capitalized suffix) pub name: String, /// The nestedness level the container was found in pub level: u8, /// Members or enum members of the container - pub members: Vec, + pub members: Vec, /// Documentation properties extracted for the container pub docs: Option, /// Whether this container is an enum pub is_enum: bool, } -/// Output member belonging to an OutputStruct +/// Output member belonging to an Container #[derive(Default, Debug)] -pub struct OutputMember { +pub struct Member { /// The raw, unsanitized name of the member /// /// This must be sanitized against KEYWORDS before it can be printed @@ -34,12 +34,12 @@ pub struct OutputMember { /// - skip_serializing_if = "Option::is_none" (if the type is an Option) /// - rename = "orig_name" (if the type does not match rust casing conventions) /// - /// The `rename` attribute is only set if `OutputStruct::rename` is called. + /// The `rename` attribute is only set if `Container::rename` is called. pub serde_annot: Vec, pub docs: Option, } -impl OutputStruct { +impl Container { pub fn uses_btreemaps(&self) -> bool { self.members.iter().any(|m| m.type_.contains("BTreeMap")) } @@ -57,7 +57,7 @@ impl OutputStruct { } } -impl OutputStruct { +impl Container { /// Rename all struct members to rust conventions pub fn rename(&mut self) { for m in &mut self.members { @@ -67,7 +67,8 @@ impl OutputStruct { m.serde_annot.push(format!("rename = \"{}\"", m.name)); } m.name = pascald; - } else { // regular container + } else { + // regular container let snaked = m.name.to_snake_case(); if snaked != m.name { m.serde_annot.push(format!("rename = \"{}\"", m.name));