Cargo.lock 🔗
@@ -8207,6 +8207,7 @@ dependencies = [
"palette",
"pathfinder_color",
"rust-embed",
+ "schemars",
"serde",
"serde_json",
"simplelog",
Marshall Bowers created
This PR adds a quick subcommand to the `theme_importer` to facilitate
printing out the JSON schema for a theme.
Note that you do need to pass a `<PATH>` to the subcommand still, even
though it will be ignored. I'll rework the CLI to this at some point.
The JSON schema for the current version of the theme can also be found
at
[`https://zed.dev/schema/themes/v0.1.0.json`](https://zed.dev/schema/themes/v0.1.0.json).
Release Notes:
- N/A
Cargo.lock | 1 +
crates/theme_importer/Cargo.toml | 1 +
crates/theme_importer/src/main.rs | 29 +++++++++++++++++++++++++++--
3 files changed, 29 insertions(+), 2 deletions(-)
@@ -8207,6 +8207,7 @@ dependencies = [
"palette",
"pathfinder_color",
"rust-embed",
+ "schemars",
"serde",
"serde_json",
"simplelog",
@@ -18,6 +18,7 @@ log.workspace = true
palette = { version = "0.7.3", default-features = false, features = ["std"] }
pathfinder_color = "0.5"
rust-embed.workspace = true
+schemars = { workspace = true, features = ["indexmap"] }
serde.workspace = true
serde_json.workspace = true
simplelog = "0.9"
@@ -7,13 +7,14 @@ use std::fs::File;
use std::path::PathBuf;
use anyhow::{Context, Result};
-use clap::Parser;
+use clap::{Parser, Subcommand};
use indexmap::IndexMap;
use json_comments::StripComments;
use log::LevelFilter;
+use schemars::schema_for;
use serde::Deserialize;
use simplelog::{TermLogger, TerminalMode};
-use theme::{Appearance, AppearanceContent};
+use theme::{Appearance, AppearanceContent, ThemeFamilyContent};
use crate::vscode::VsCodeTheme;
use crate::vscode::VsCodeThemeConverter;
@@ -74,6 +75,15 @@ struct Args {
/// Whether to warn when values are missing from the theme.
#[arg(long)]
warn_on_missing: bool,
+
+ #[command(subcommand)]
+ command: Option<Command>,
+}
+
+#[derive(Subcommand)]
+enum Command {
+ /// Prints the JSON schema for a theme.
+ PrintSchema,
}
fn main() -> Result<()> {
@@ -97,6 +107,21 @@ fn main() -> Result<()> {
TermLogger::init(LevelFilter::Trace, log_config, TerminalMode::Mixed)
.expect("could not initialize logger");
+ if let Some(command) = args.command {
+ match command {
+ Command::PrintSchema => {
+ let theme_family_schema = schema_for!(ThemeFamilyContent);
+
+ println!(
+ "{}",
+ serde_json::to_string_pretty(&theme_family_schema).unwrap()
+ );
+
+ return Ok(());
+ }
+ }
+ }
+
let theme_file_path = args.theme_path;
let theme_file = match File::open(&theme_file_path) {