diff --git a/Cargo.lock b/Cargo.lock index d186d0c17..2d7ac9ab5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1242,6 +1242,7 @@ dependencies = [ "log", "num-traits", "sanitize-filename", + "schemars", "serde", "serde_json", "tempfile", @@ -1514,6 +1515,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "dyn-clone" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" + [[package]] name = "ecdsa" version = "0.14.8" @@ -4248,6 +4255,30 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "schemars" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + [[package]] name = "scopeguard" version = "1.1.0" @@ -4368,6 +4399,17 @@ dependencies = [ "syn 2.0.15", ] +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "serde_json" version = "1.0.96" @@ -5799,9 +5841,9 @@ dependencies = [ [[package]] name = "yerpc" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2c26a804eaa30c1ff1a296dc6dd1a7d7c622750dafcd0d6b2ed5e3c5c3beb22" +checksum = "30fc983d32883ecb563227a2dcdcbe8567decd9c533b5ecca7e3099e2f7d4c96" dependencies = [ "anyhow", "async-channel", @@ -5811,6 +5853,7 @@ dependencies = [ "futures", "futures-util", "log", + "schemars", "serde", "serde_json", "tokio", @@ -5821,9 +5864,9 @@ dependencies = [ [[package]] name = "yerpc_derive" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd53ff9053698697b92c2535bf7ecb983fd5d546d690b7c725e5070d6d9a620" +checksum = "6d6b8ce490e8719fe84d7d80ad4d58572b2ea9d7a83d156f6afd6ab3ad5cfb94" dependencies = [ "convert_case 0.5.0", "darling 0.14.3", diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 5ccf92bcb..5d97eb66b 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -25,7 +25,7 @@ anyhow = "1" thiserror = "1" rand = "0.8" once_cell = "1.17.0" -yerpc = { version = "0.4.4", features = ["anyhow_expose"] } +yerpc = { version = "0.5.1", features = ["anyhow_expose"] } [features] default = ["vendored"] diff --git a/deltachat-jsonrpc/Cargo.toml b/deltachat-jsonrpc/Cargo.toml index 767a0ee90..14d01f29a 100644 --- a/deltachat-jsonrpc/Cargo.toml +++ b/deltachat-jsonrpc/Cargo.toml @@ -15,13 +15,14 @@ required-features = ["webserver"] anyhow = "1" deltachat = { path = ".." } num-traits = "0.2" +schemars = "0.8.11" serde = { version = "1.0", features = ["derive"] } tempfile = "3.3.0" log = "0.4" async-channel = { version = "1.8.0" } futures = { version = "0.3.28" } serde_json = "1.0.96" -yerpc = { version = "0.4.4", features = ["anyhow_expose"] } +yerpc = { version = "0.5.1", features = ["anyhow_expose", "openrpc"] } typescript-type-def = { version = "0.5.5", features = ["json_value"] } tokio = { version = "1.28.0" } sanitize-filename = "0.4" diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index b71718299..fca691f29 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -144,7 +144,11 @@ impl CommandApi { } } -#[rpc(all_positional, ts_outdir = "typescript/generated")] +#[rpc( + all_positional, + ts_outdir = "typescript/generated", + openrpc_outdir = "openrpc" +)] impl CommandApi { /// Test function. async fn sleep(&self, delay: f64) { diff --git a/deltachat-jsonrpc/src/api/types/account.rs b/deltachat-jsonrpc/src/api/types/account.rs index 8e0f80aef..d27a53723 100644 --- a/deltachat-jsonrpc/src/api/types/account.rs +++ b/deltachat-jsonrpc/src/api/types/account.rs @@ -6,7 +6,7 @@ use typescript_type_def::TypeDef; use super::color_int_to_hex_string; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "type")] pub enum Account { #[serde(rename_all = "camelCase")] diff --git a/deltachat-jsonrpc/src/api/types/chat.rs b/deltachat-jsonrpc/src/api/types/chat.rs index a658e26f3..d5f0b8c0b 100644 --- a/deltachat-jsonrpc/src/api/types/chat.rs +++ b/deltachat-jsonrpc/src/api/types/chat.rs @@ -13,7 +13,7 @@ use typescript_type_def::TypeDef; use super::color_int_to_hex_string; use super::contact::ContactObject; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct FullChat { id: u32, @@ -121,7 +121,7 @@ impl FullChat { /// - can_send /// /// used when you only need the basic metadata of a chat like type, name, profile picture -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct BasicChat { id: u32, @@ -166,7 +166,7 @@ impl BasicChat { } } -#[derive(Clone, Serialize, Deserialize, TypeDef)] +#[derive(Clone, Serialize, Deserialize, TypeDef, schemars::JsonSchema)] pub enum MuteDuration { NotMuted, Forever, @@ -191,7 +191,7 @@ impl MuteDuration { } } -#[derive(Clone, Serialize, Deserialize, TypeDef)] +#[derive(Clone, Serialize, Deserialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "ChatVisibility")] pub enum JSONRPCChatVisibility { Normal, diff --git a/deltachat-jsonrpc/src/api/types/chat_list.rs b/deltachat-jsonrpc/src/api/types/chat_list.rs index 5c63b5def..c7603de46 100644 --- a/deltachat-jsonrpc/src/api/types/chat_list.rs +++ b/deltachat-jsonrpc/src/api/types/chat_list.rs @@ -8,13 +8,16 @@ use deltachat::{ chatlist::Chatlist, }; use num_traits::cast::ToPrimitive; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use typescript_type_def::TypeDef; use super::color_int_to_hex_string; use super::message::MessageViewtype; -#[derive(Serialize, TypeDef)] +#[derive(Deserialize, Serialize, TypeDef, schemars::JsonSchema)] +pub struct ChatListEntry(pub u32, pub u32); + +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "type")] pub enum ChatListItemFetchResult { #[serde(rename_all = "camelCase")] diff --git a/deltachat-jsonrpc/src/api/types/contact.rs b/deltachat-jsonrpc/src/api/types/contact.rs index d67fc7fb1..53b0ef67c 100644 --- a/deltachat-jsonrpc/src/api/types/contact.rs +++ b/deltachat-jsonrpc/src/api/types/contact.rs @@ -6,7 +6,7 @@ use typescript_type_def::TypeDef; use super::color_int_to_hex_string; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Contact", rename_all = "camelCase")] pub struct ContactObject { address: String, diff --git a/deltachat-jsonrpc/src/api/types/events.rs b/deltachat-jsonrpc/src/api/types/events.rs index 37e8c6317..892302a4f 100644 --- a/deltachat-jsonrpc/src/api/types/events.rs +++ b/deltachat-jsonrpc/src/api/types/events.rs @@ -2,7 +2,7 @@ use deltachat::{Event as CoreEvent, EventType as CoreEventType}; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct Event { /// Event payload. @@ -21,7 +21,7 @@ impl From for Event { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "type")] pub enum EventType { /// The library-user may write an informational string to the log. diff --git a/deltachat-jsonrpc/src/api/types/http.rs b/deltachat-jsonrpc/src/api/types/http.rs index 3b9d29509..9121a677e 100644 --- a/deltachat-jsonrpc/src/api/types/http.rs +++ b/deltachat-jsonrpc/src/api/types/http.rs @@ -2,7 +2,7 @@ use deltachat::net::HttpResponse as CoreHttpResponse; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] pub struct HttpResponse { /// base64-encoded response body. blob: String, diff --git a/deltachat-jsonrpc/src/api/types/location.rs b/deltachat-jsonrpc/src/api/types/location.rs index 374e408d8..f610b42d3 100644 --- a/deltachat-jsonrpc/src/api/types/location.rs +++ b/deltachat-jsonrpc/src/api/types/location.rs @@ -2,7 +2,7 @@ use deltachat::location::Location; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Location", rename_all = "camelCase")] pub struct JsonrpcLocation { pub location_id: u32, diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index b030e7616..7ebcccc46 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -10,8 +10,7 @@ use deltachat::message::MsgId; use deltachat::message::Viewtype; use deltachat::reaction::get_msg_reactions; use num_traits::cast::ToPrimitive; -use serde::Deserialize; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use typescript_type_def::TypeDef; use super::color_int_to_hex_string; @@ -19,14 +18,14 @@ use super::contact::ContactObject; use super::reactions::JSONRPCReactions; use super::webxdc::WebxdcMessageInfo; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase", tag = "variant")] pub enum MessageLoadResult { Message(MessageObject), LoadingError { error: String }, } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Message", rename_all = "camelCase")] pub struct MessageObject { id: u32, @@ -86,7 +85,7 @@ pub struct MessageObject { reactions: Option, } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(tag = "kind")] enum MessageQuote { JustText { @@ -238,7 +237,7 @@ impl MessageObject { } } -#[derive(Serialize, Deserialize, TypeDef)] +#[derive(Serialize, Deserialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Viewtype")] pub enum MessageViewtype { Unknown, @@ -314,7 +313,7 @@ impl From for Viewtype { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] pub enum DownloadState { Done, Available, @@ -333,7 +332,7 @@ impl From for DownloadState { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] pub enum SystemMessageType { Unknown, GroupNameChanged, @@ -388,7 +387,7 @@ impl From for SystemMessageType { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageNotificationInfo { id: u32, @@ -446,7 +445,7 @@ impl MessageNotificationInfo { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageSearchResult { id: u32, @@ -507,7 +506,7 @@ impl MessageSearchResult { } } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase", rename = "MessageListItem", tag = "kind")] pub enum JSONRPCMessageListItem { Message { @@ -533,7 +532,7 @@ impl From for JSONRPCMessageListItem { } } -#[derive(Deserialize, TypeDef)] +#[derive(Deserialize, Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageData { pub text: Option, @@ -545,7 +544,7 @@ pub struct MessageData { pub quoted_message_id: Option, } -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct MessageReadReceipt { pub contact_id: u32, diff --git a/deltachat-jsonrpc/src/api/types/provider_info.rs b/deltachat-jsonrpc/src/api/types/provider_info.rs index 1cc5a7d46..43b868444 100644 --- a/deltachat-jsonrpc/src/api/types/provider_info.rs +++ b/deltachat-jsonrpc/src/api/types/provider_info.rs @@ -3,7 +3,7 @@ use num_traits::cast::ToPrimitive; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename_all = "camelCase")] pub struct ProviderInfo { pub before_login_hint: String, diff --git a/deltachat-jsonrpc/src/api/types/qr.rs b/deltachat-jsonrpc/src/api/types/qr.rs index 607b495ec..d53ebeab5 100644 --- a/deltachat-jsonrpc/src/api/types/qr.rs +++ b/deltachat-jsonrpc/src/api/types/qr.rs @@ -2,7 +2,7 @@ use deltachat::qr::Qr; use serde::Serialize; use typescript_type_def::TypeDef; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Qr", rename_all = "camelCase")] #[serde(tag = "type")] pub enum QrObject { diff --git a/deltachat-jsonrpc/src/api/types/reactions.rs b/deltachat-jsonrpc/src/api/types/reactions.rs index d068b23c5..37739c848 100644 --- a/deltachat-jsonrpc/src/api/types/reactions.rs +++ b/deltachat-jsonrpc/src/api/types/reactions.rs @@ -6,7 +6,7 @@ use serde::Serialize; use typescript_type_def::TypeDef; /// A single reaction emoji. -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Reaction", rename_all = "camelCase")] pub struct JSONRPCReaction { /// Emoji. @@ -20,7 +20,7 @@ pub struct JSONRPCReaction { } /// Structure representing all reactions to a particular message. -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "Reactions", rename_all = "camelCase")] pub struct JSONRPCReactions { /// Map from a contact to it's reaction to message. diff --git a/deltachat-jsonrpc/src/api/types/webxdc.rs b/deltachat-jsonrpc/src/api/types/webxdc.rs index f89310667..71db9ed93 100644 --- a/deltachat-jsonrpc/src/api/types/webxdc.rs +++ b/deltachat-jsonrpc/src/api/types/webxdc.rs @@ -8,7 +8,7 @@ use typescript_type_def::TypeDef; use super::maybe_empty_string_to_option; -#[derive(Serialize, TypeDef)] +#[derive(Serialize, TypeDef, schemars::JsonSchema)] #[serde(rename = "WebxdcMessageInfo", rename_all = "camelCase")] pub struct WebxdcMessageInfo { /// The name of the app. diff --git a/deltachat-rpc-server/Cargo.toml b/deltachat-rpc-server/Cargo.toml index b1f8151fb..48146f39b 100644 --- a/deltachat-rpc-server/Cargo.toml +++ b/deltachat-rpc-server/Cargo.toml @@ -21,7 +21,7 @@ serde_json = "1.0.96" serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.28.0", features = ["io-std"] } tokio-util = "0.7.8" -yerpc = { version = "0.4.0", features = ["anyhow_expose"] } +yerpc = { version = "0.5.1", features = ["anyhow_expose"] } [features] default = ["vendored"]