Skip to content

Commit

Permalink
Add schema_generator for generating JSON schemas (zed-industries#23991
Browse files Browse the repository at this point in the history
)

This PR adds a `schema_generator` crate that can be used to generate our
various JSON schemas for publishing elsewhere.

Currently it does the simplest thing possible and just prints the JSON
schema to stdout. We can make this a but more robust later.

I also removed the schema-printing facilities from the `theme_importer`,
as they don't really make sense there.

Release Notes:

- N/A
  • Loading branch information
maxdeviant authored Jan 31, 2025
1 parent b6e54ae commit e5bc048
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 46 deletions.
14 changes: 13 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ members = [
"crates/rich_text",
"crates/rope",
"crates/rpc",
"crates/schema_generator",
"crates/search",
"crates/semantic_index",
"crates/semantic_version",
Expand Down
18 changes: 18 additions & 0 deletions crates/schema_generator/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[package]
name = "schema_generator"
version = "0.1.0"
publish.workspace = true
edition.workspace = true
license = "GPL-3.0-or-later"

[lints]
workspace = true

[dependencies]
anyhow.workspace = true
clap = { workspace = true, features = ["derive"] }
env_logger.workspace = true
schemars = { workspace = true, features = ["indexmap2"] }
serde.workspace = true
serde_json.workspace = true
theme.workspace = true
1 change: 1 addition & 0 deletions crates/schema_generator/LICENSE-GPL
26 changes: 26 additions & 0 deletions crates/schema_generator/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use anyhow::Result;
use clap::Parser;
use schemars::schema_for;
use theme::{IconThemeFamilyContent, ThemeFamilyContent};

#[derive(Parser, Debug)]
struct Args {}

fn main() -> Result<()> {
env_logger::init();

let _args = Args::parse();

let theme_family_schema = schema_for!(ThemeFamilyContent);
println!("Theme Schema:");
println!("{}", serde_json::to_string_pretty(&theme_family_schema)?);

let icon_theme_family_schema = schema_for!(IconThemeFamilyContent);
println!("Icon Theme Schema:");
println!(
"{}",
serde_json::to_string_pretty(&icon_theme_family_schema)?
);

Ok(())
}
1 change: 0 additions & 1 deletion crates/theme_importer/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ indexmap.workspace = true
log.workspace = true
palette.workspace = true
rust-embed.workspace = true
schemars = { workspace = true, features = ["indexmap2"] }
serde.workspace = true
serde_json.workspace = true
serde_json_lenient.workspace = true
Expand Down
61 changes: 17 additions & 44 deletions crates/theme_importer/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@ use std::io::Write;
use std::path::PathBuf;

use anyhow::{Context as _, Result};
use clap::{Parser, Subcommand};
use clap::Parser;
use indexmap::IndexMap;
use log::LevelFilter;
use schemars::schema_for;
use serde::Deserialize;
use simplelog::ColorChoice;
use simplelog::{TermLogger, TerminalMode};
use theme::{Appearance, AppearanceContent, ThemeFamilyContent};
use theme::{Appearance, AppearanceContent};

use crate::vscode::VsCodeTheme;
use crate::vscode::VsCodeThemeConverter;
Expand Down Expand Up @@ -71,53 +70,25 @@ pub struct ThemeMetadata {
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Args {
#[command(subcommand)]
command: Command,
}
/// The path to the theme to import.
theme_path: PathBuf,

/// Whether to warn when values are missing from the theme.
#[arg(long)]
warn_on_missing: bool,

#[derive(PartialEq, Subcommand)]
enum Command {
/// Prints the JSON schema for a theme.
PrintSchema,
/// Converts a VSCode theme to Zed format [default]
Convert {
/// The path to the theme to import.
theme_path: PathBuf,

/// Whether to warn when values are missing from the theme.
#[arg(long)]
warn_on_missing: bool,

/// The path to write the output to.
#[arg(long, short)]
output: Option<PathBuf>,
},
/// The path to write the output to.
#[arg(long, short)]
output: Option<PathBuf>,
}

fn main() -> Result<()> {
let args = Args::parse();

match args.command {
Command::PrintSchema => {
let theme_family_schema = schema_for!(ThemeFamilyContent);
println!(
"{}",
serde_json::to_string_pretty(&theme_family_schema).unwrap()
);
Ok(())
}
Command::Convert {
theme_path,
warn_on_missing,
output,
} => convert(theme_path, output, warn_on_missing),
}
}

fn convert(theme_file_path: PathBuf, output: Option<PathBuf>, warn_on_missing: bool) -> Result<()> {
let log_config = {
let mut config = simplelog::ConfigBuilder::new();
if !warn_on_missing {

if !args.warn_on_missing {
config.add_filter_ignore_str("theme_printer");
}

Expand All @@ -132,11 +103,13 @@ fn convert(theme_file_path: PathBuf, output: Option<PathBuf>, warn_on_missing: b
)
.expect("could not initialize logger");

let theme_file_path = args.theme_path;

let theme_file = match File::open(&theme_file_path) {
Ok(file) => file,
Err(err) => {
log::info!("Failed to open file at path: {:?}", theme_file_path);
return Err(err.into());
return Err(err)?;
}
};

Expand All @@ -159,7 +132,7 @@ fn convert(theme_file_path: PathBuf, output: Option<PathBuf>, warn_on_missing: b
);
let theme_json = serde_json::to_string_pretty(&theme).unwrap();

if let Some(output) = output {
if let Some(output) = args.output {
let mut file = File::create(output)?;
file.write_all(theme_json.as_bytes())?;
} else {
Expand Down

0 comments on commit e5bc048

Please sign in to comment.