From e5fe811d7ad0fc26934edd76f891d20bdc3bb194 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 30 Jan 2024 23:33:54 -0500 Subject: [PATCH] theme_importer: Add ability to print theme JSON schema (#7129) 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 `` 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(-) diff --git a/Cargo.lock b/Cargo.lock index d8b069e39c23f1296f634b9d951eea1ca37f90ff..87e56d599e5549cf24f6cef1444d3e3cae27721a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8207,6 +8207,7 @@ dependencies = [ "palette", "pathfinder_color", "rust-embed", + "schemars", "serde", "serde_json", "simplelog", diff --git a/crates/theme_importer/Cargo.toml b/crates/theme_importer/Cargo.toml index 6b5b5743f5d7a55e22b9ec8b6e8351e089e7bfe6..2214af85c740f1472e9807ec809b84c4fdaed42e 100644 --- a/crates/theme_importer/Cargo.toml +++ b/crates/theme_importer/Cargo.toml @@ -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" diff --git a/crates/theme_importer/src/main.rs b/crates/theme_importer/src/main.rs index 6f3dc83006c94e1a776e02d811f9a7c8f9e8f6a6..a8cc8a1bdf78a6edbc523d4947b173c1a7829710 100644 --- a/crates/theme_importer/src/main.rs +++ b/crates/theme_importer/src/main.rs @@ -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, +} + +#[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) {