diff --git a/Cargo.lock b/Cargo.lock index 87165de..c22bd25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -985,6 +985,12 @@ dependencies = [ "linux-raw-sys 0.6.4", ] +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "edid-rs" version = "0.1.0" @@ -2294,6 +2300,7 @@ name = "niri-ipc" version = "0.1.7" dependencies = [ "clap", + "schemars", "serde", "serde_json", ] @@ -3307,6 +3314,30 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b53b0a5db882a8e2fdaae0a43f7b39e7e9082389e978398bdf223a55b581248" +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.67", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -3345,6 +3376,17 @@ dependencies = [ "syn 2.0.69", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.67", +] + [[package]] name = "serde_json" version = "1.0.120" diff --git a/niri-ipc/Cargo.toml b/niri-ipc/Cargo.toml index e096311..d0bafab 100644 --- a/niri-ipc/Cargo.toml +++ b/niri-ipc/Cargo.toml @@ -9,6 +9,7 @@ repository.workspace = true [dependencies] clap = { workspace = true, optional = true } +schemars = "0.8.21" serde.workspace = true serde_json.workspace = true diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs index 16817df..021300b 100644 --- a/niri-ipc/src/lib.rs +++ b/niri-ipc/src/lib.rs @@ -4,13 +4,14 @@ use std::collections::HashMap; use std::str::FromStr; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; mod socket; pub use socket::{Socket, SOCKET_PATH_ENV}; /// Request from client to niri. -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)] pub enum Request { /// Request the version string for the running niri instance. Version, @@ -50,7 +51,7 @@ pub enum Request { pub type Reply = Result; /// Successful response from niri to client. -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)] pub enum Response { /// A request that does not need a response was handled successfully. Handled, @@ -73,7 +74,7 @@ pub enum Response { /// Actions that niri can perform. // Variants in this enum should match the spelling of the ones in niri-config. Most, but not all, // variants from niri-config should be present here. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)] #[cfg_attr(feature = "clap", derive(clap::Parser))] #[cfg_attr(feature = "clap", command(subcommand_value_name = "ACTION"))] #[cfg_attr(feature = "clap", command(subcommand_help_heading = "Actions"))] @@ -277,7 +278,7 @@ pub enum Action { } /// Change in window or column size. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, JsonSchema)] pub enum SizeChange { /// Set the size in logical pixels. SetFixed(i32), @@ -290,7 +291,7 @@ pub enum SizeChange { } /// Workspace reference (index or name) to operate on. -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema)] pub enum WorkspaceReferenceArg { /// Index of the workspace. Index(u8), @@ -299,7 +300,7 @@ pub enum WorkspaceReferenceArg { } /// Layout to switch to. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema)] pub enum LayoutSwitchTarget { /// The next configured layout. Next, @@ -310,7 +311,7 @@ pub enum LayoutSwitchTarget { /// Output actions that niri can perform. // Variants in this enum should match the spelling of the ones in niri-config. Most thigs from // niri-config should be present here. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)] #[cfg_attr(feature = "clap", derive(clap::Parser))] #[cfg_attr(feature = "clap", command(subcommand_value_name = "ACTION"))] #[cfg_attr(feature = "clap", command(subcommand_help_heading = "Actions"))] @@ -361,7 +362,7 @@ pub enum OutputAction { } /// Output mode to set. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, JsonSchema)] pub enum ModeToSet { /// Niri will pick the mode automatically. Automatic, @@ -370,7 +371,7 @@ pub enum ModeToSet { } /// Output mode as set in the config file. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, JsonSchema)] pub struct ConfiguredMode { /// Width in physical pixels. pub width: u16, @@ -381,7 +382,7 @@ pub struct ConfiguredMode { } /// Output scale to set. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, JsonSchema)] pub enum ScaleToSet { /// Niri will pick the scale automatically. Automatic, @@ -390,7 +391,7 @@ pub enum ScaleToSet { } /// Output position to set. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, JsonSchema)] #[cfg_attr(feature = "clap", derive(clap::Subcommand))] #[cfg_attr(feature = "clap", command(subcommand_value_name = "POSITION"))] #[cfg_attr(feature = "clap", command(subcommand_help_heading = "Position Values"))] @@ -404,7 +405,7 @@ pub enum PositionToSet { } /// Output position as set in the config file. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, JsonSchema)] #[cfg_attr(feature = "clap", derive(clap::Args))] pub struct ConfiguredPosition { /// Logical X position. @@ -414,7 +415,7 @@ pub struct ConfiguredPosition { } /// Connected output. -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)] pub struct Output { /// Name of the output. pub name: String, @@ -441,7 +442,7 @@ pub struct Output { } /// Output mode. -#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)] +#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, JsonSchema)] pub struct Mode { /// Width in physical pixels. pub width: u16, @@ -454,7 +455,7 @@ pub struct Mode { } /// Logical output in the compositor's coordinate space. -#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)] +#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, JsonSchema)] pub struct LogicalOutput { /// Logical X position. pub x: i32, @@ -471,7 +472,7 @@ pub struct LogicalOutput { } /// Output transform, which goes counter-clockwise. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema)] #[cfg_attr(feature = "clap", derive(clap::ValueEnum))] pub enum Transform { /// Untransformed. @@ -499,7 +500,7 @@ pub enum Transform { } /// Toplevel window. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)] pub struct Window { /// Title, if set. pub title: Option, @@ -508,7 +509,7 @@ pub struct Window { } /// Output configuration change result. -#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema)] pub enum OutputConfigChanged { /// The target output was connected and the change was applied. Applied, @@ -517,7 +518,7 @@ pub enum OutputConfigChanged { } /// A workspace. -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema)] pub struct Workspace { /// Index of the workspace on its monitor. ///