firecracker_http_client/
action.rs1use crate::error::FirecrackerError;
2use async_trait::async_trait;
3use lazy_static::lazy_static;
4use regex::Regex;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct InstanceActionInfo {
9 pub action_type: String,
10}
11
12impl InstanceActionInfo {
13 pub fn new(action_type: &str) -> Self {
14 Self {
15 action_type: action_type.to_string(),
16 }
17 }
18}
19
20lazy_static! {
21 static ref ACTION_TYPE_REGEX: Regex =
22 Regex::new(r"^(InstanceStart|InstanceHalt|SendCtrlAltDel)$").unwrap();
23}
24
25#[async_trait]
26pub trait ActionOperations {
27 async fn create_sync_action(&self, action: &InstanceActionInfo)
28 -> Result<(), FirecrackerError>;
29}
30
31#[async_trait]
32impl ActionOperations for crate::FirecrackerClient {
33 async fn create_sync_action(
34 &self,
35 action: &InstanceActionInfo,
36 ) -> Result<(), FirecrackerError> {
37 let url = self.url("actions")?;
38 let response = self.client.put(url).json(action).send().await?;
39
40 if !response.status().is_success() {
41 return Err(FirecrackerError::Api {
42 status_code: response.status().as_u16(),
43 message: response.text().await?,
44 });
45 }
46
47 Ok(())
48 }
49}