Skip to content

Commit 7365058

Browse files
committed
add javaopts
1 parent 3dab12c commit 7365058

File tree

4 files changed

+96
-21
lines changed

4 files changed

+96
-21
lines changed

src/codegen/java.rs

+79-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,89 @@
11
use crate::schema_extraction::{FieldType, Structure};
2+
use clap::{Parser, ValueEnum};
23
use std::io::{Error, Write};
34

4-
pub fn java<W: Write>(schema: &[Structure], out: &mut W) -> Result<(), Error> {
5+
#[derive(Parser, Debug)]
6+
pub struct JavaOpts {
7+
#[arg(short, long, default_value_t = JavaAccessModifier::Public)]
8+
class_access_modifier: JavaAccessModifier,
9+
10+
#[arg(short, long, default_value_t = JavaAccessModifier::Public)]
11+
attribute_access_modifier: JavaAccessModifier,
12+
13+
#[arg(short, long)]
14+
final_attributes: bool,
15+
16+
#[arg(short, long)]
17+
getters: bool,
18+
19+
#[arg(short, long)]
20+
setters: bool,
21+
}
22+
23+
#[derive(Debug, Clone, ValueEnum)]
24+
pub enum JavaAccessModifier {
25+
Public,
26+
Private,
27+
Protected,
28+
Default,
29+
}
30+
31+
impl ToString for JavaAccessModifier {
32+
fn to_string(&self) -> String {
33+
match self {
34+
JavaAccessModifier::Public => "public",
35+
JavaAccessModifier::Private => "private",
36+
JavaAccessModifier::Protected => "protected",
37+
JavaAccessModifier::Default => "",
38+
}
39+
.into()
40+
}
41+
}
42+
43+
pub fn java<W: Write>(schema: &[Structure], opts: JavaOpts, out: &mut W) -> Result<(), Error> {
544
for class in schema {
6-
writeln!(out, "class {} {{", class.name)?;
45+
writeln!(
46+
out,
47+
"{} class {} {{",
48+
opts.class_access_modifier.to_string(),
49+
class.name
50+
)?;
751

852
for field in &class.fields {
953
let java_type = field_type_to_java_type(&field.type_);
10-
writeln!(out, " {} {};", java_type, field.name)?;
54+
writeln!(
55+
out,
56+
" {} {} {} {};",
57+
opts.attribute_access_modifier.to_string(),
58+
match opts.final_attributes {
59+
true => "final",
60+
false => "",
61+
},
62+
java_type,
63+
field.name
64+
)?;
65+
}
66+
67+
if opts.getters {
68+
for field in &class.fields {
69+
let java_type = field_type_to_java_type(&field.type_);
70+
writeln!(
71+
out,
72+
" public {} get{}() {{ return {}; }}",
73+
java_type, &field.name, &field.name
74+
)?;
75+
}
76+
}
77+
78+
if opts.setters {
79+
for field in &class.fields {
80+
let java_type = field_type_to_java_type(&field.type_);
81+
writeln!(
82+
out,
83+
" public void set{}({} {}) {{ this.{} = {}; }}",
84+
&field.name, java_type, &field.name, &field.name, &field.name
85+
)?;
86+
}
1187
}
1288

1389
writeln!(out, "}}")?;

src/codegen/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
mod java;
22

3-
pub use java::java;
3+
pub use java::{java, JavaOpts};

src/main.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::{fs::File, io::BufReader};
22

3-
use clap::Parser;
3+
use clap::{Parser, Subcommand};
4+
use codegen::JavaOpts;
45
use serde_json::Value;
56

67
mod codegen;
@@ -11,6 +12,14 @@ struct JSONCodeGen {
1112
/// json filepath
1213
#[arg(short, long)]
1314
filepath: String,
15+
16+
#[command(subcommand)]
17+
lang: LangOpts,
18+
}
19+
20+
#[derive(Subcommand, Debug)]
21+
enum LangOpts {
22+
Java(JavaOpts),
1423
}
1524

1625
fn main() -> anyhow::Result<()> {
@@ -22,7 +31,10 @@ fn main() -> anyhow::Result<()> {
2231
let json: Value = serde_json::from_reader(reader)?;
2332
let schema = schema_extraction::process(json);
2433
let mut stdout = std::io::stdout().lock();
25-
codegen::java(&schema, &mut stdout)?;
34+
35+
match args.lang {
36+
LangOpts::Java(opts) => codegen::java(&schema, opts, &mut stdout)?,
37+
}
2638

2739
Ok(())
2840
}

src/schema_extraction.rs

+2-15
Original file line numberDiff line numberDiff line change
@@ -71,21 +71,8 @@ fn determine_type(value: Value, name: String, structs: &mut Vec<Structure>) -> F
7171
Value::String(_) => FieldType::String,
7272
Value::Array(arr) => FieldType::Array(Box::new(process_array(arr, name, structs))),
7373
Value::Object(nested_obj) => {
74-
let nested_obj_name = pascal_case(&name);
75-
process_object(nested_obj, nested_obj_name.clone(), structs);
76-
FieldType::Object(nested_obj_name)
74+
process_object(nested_obj, name.clone(), structs);
75+
FieldType::Object(name.clone())
7776
}
7877
}
7978
}
80-
81-
fn pascal_case(text: &str) -> String {
82-
text.into()
83-
}
84-
85-
fn camel_case(text: &str) -> String {
86-
text.into()
87-
}
88-
89-
fn snake_case(text: &str) -> String {
90-
text.into()
91-
}

0 commit comments

Comments
 (0)