Skip to content

Commit 3dab12c

Browse files
committed
initial working java codegen prototype
1 parent e588213 commit 3dab12c

File tree

7 files changed

+459
-0
lines changed

7 files changed

+459
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/target
2+
sample.json

Cargo.lock

+296
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "jsoncodegen"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
serde = { version = "1.0", features = ["derive"] }
8+
serde_json = "1.0"
9+
clap = { version = "4", features = ["derive"] }
10+
anyhow = "1"

src/codegen/java.rs

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use crate::schema_extraction::{FieldType, Structure};
2+
use std::io::{Error, Write};
3+
4+
pub fn java<W: Write>(schema: &[Structure], out: &mut W) -> Result<(), Error> {
5+
for class in schema {
6+
writeln!(out, "class {} {{", class.name)?;
7+
8+
for field in &class.fields {
9+
let java_type = field_type_to_java_type(&field.type_);
10+
writeln!(out, " {} {};", java_type, field.name)?;
11+
}
12+
13+
writeln!(out, "}}")?;
14+
}
15+
16+
Ok(())
17+
}
18+
19+
fn field_type_to_java_type(field_type: &FieldType) -> String {
20+
match field_type {
21+
FieldType::String => "String".into(),
22+
FieldType::Integer => "Integer".into(),
23+
FieldType::Float => "Double".into(),
24+
FieldType::Boolean => "Boolean".into(),
25+
FieldType::Unknown => "Object".into(),
26+
FieldType::Object(name) => name.into(),
27+
FieldType::Array(type_) => format!("List<{}>", field_type_to_java_type(type_)),
28+
}
29+
}

src/codegen/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mod java;
2+
3+
pub use java::java;

src/main.rs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use std::{fs::File, io::BufReader};
2+
3+
use clap::Parser;
4+
use serde_json::Value;
5+
6+
mod codegen;
7+
mod schema_extraction;
8+
9+
#[derive(Parser, Debug)]
10+
struct JSONCodeGen {
11+
/// json filepath
12+
#[arg(short, long)]
13+
filepath: String,
14+
}
15+
16+
fn main() -> anyhow::Result<()> {
17+
let args = JSONCodeGen::parse();
18+
19+
let file = File::open(args.filepath)?;
20+
let reader = BufReader::new(file);
21+
22+
let json: Value = serde_json::from_reader(reader)?;
23+
let schema = schema_extraction::process(json);
24+
let mut stdout = std::io::stdout().lock();
25+
codegen::java(&schema, &mut stdout)?;
26+
27+
Ok(())
28+
}

0 commit comments

Comments
 (0)