emu_cli/qmp/messages/
mod.rs1mod block;
2
3use anyhow::{anyhow, Result};
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[derive(Debug, Clone, Default, Serialize, Deserialize)]
8#[serde(rename_all = "kebab-case")]
9pub struct GenericReturn {
10 #[serde(rename = "return")]
11 pub result: Option<HashMap<(), ()>>,
12 pub error: Option<ErrorDetail>,
13}
14
15impl<T> Into<Result<T>> for GenericReturn
16where
17 T: for<'de> serde::Deserialize<'de> + Default + std::fmt::Debug,
18{
19 fn into(self) -> Result<T> {
20 if let Some(error) = self.error {
21 return Err(anyhow!("{}", error));
22 }
23
24 return Ok(T::default());
25 }
26}
27
28#[derive(Debug, Clone, Default, Serialize, Deserialize)]
29#[serde(rename_all = "kebab-case")]
30pub struct QueryBlock {
31 #[serde(rename = "return")]
32 pub result: Vec<block::Block>,
33}
34
35#[derive(Debug, Clone, Default, Serialize, Deserialize)]
36#[serde(rename_all = "kebab-case")]
37pub struct QueryJobs {
38 #[serde(rename = "return")]
39 pub result: Vec<JobInfo>,
40}
41
42#[derive(Debug, Clone, Default, Serialize, Deserialize)]
43#[serde(rename_all = "kebab-case")]
44pub struct JobInfo {
45 pub id: String,
46 #[serde(rename = "type")]
47 pub typ: String,
48 pub status: String,
49 pub current_progress: u64,
50 pub total_progress: u64,
51 pub error: Option<String>,
52}
53
54#[derive(Debug, Clone, Default, Serialize, Deserialize)]
55#[serde(rename_all = "kebab-case")]
56pub struct Event {
57 pub timestamp: Option<Timestamp>,
58 pub event: String,
59 pub data: Option<EventData>,
60}
61
62#[derive(Debug, Clone, Default, Serialize, Deserialize)]
63#[serde(rename_all = "kebab-case")]
64pub struct Timestamp {
65 pub seconds: u64,
66 pub microseconds: u64,
67}
68
69#[derive(Debug, Clone, Default, Serialize, Deserialize)]
70#[serde(rename_all = "kebab-case")]
71pub struct EventData {
72 pub status: String,
73 pub id: String,
74}
75
76#[derive(Debug, Clone, Default, Serialize, Deserialize)]
77#[serde(rename_all = "kebab-case")]
78pub struct ErrorReturn {
79 pub error: ErrorDetail,
80}
81
82impl Into<anyhow::Error> for ErrorReturn {
83 fn into(self) -> anyhow::Error {
84 anyhow!("{}", self.error)
85 }
86}
87
88#[derive(Debug, Clone, Default, Serialize, Deserialize)]
89#[serde(rename_all = "kebab-case")]
90pub struct ErrorDetail {
91 pub class: String,
92 pub desc: String,
93}
94
95impl std::fmt::Display for ErrorDetail {
96 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
97 f.write_str(&format!("{}: {}", self.class, self.desc))
98 }
99}