emu_cli/qmp/messages/
mod.rs

1mod 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}