use anyhow::Context;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::gear::Gear;
pub const ACTIVATE_PAYLOAD_VERSION: u32 = 1;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ManagedEnvInfo {
pub name: String,
pub slot_score: f64,
}
#[derive(Serialize, Deserialize, Debug, Default, Clone)]
pub struct ActivatePayload {
#[serde(default)]
pub version: u32,
#[serde(default)]
pub managed_envs: Vec<ManagedEnvInfo>,
#[serde(default)]
pub gear: serde_json::Value,
}
impl ActivatePayload {
pub fn from_owned(managed_envs: Vec<ManagedEnvInfo>, gear: &HashMap<String, Gear>) -> Self {
Self {
version: ACTIVATE_PAYLOAD_VERSION,
managed_envs,
gear: serde_json::to_value(gear).unwrap_or(serde_json::Value::Null),
}
}
}
pub const RUN_PAYLOAD_VERSION: u32 = 1;
#[derive(Serialize, Deserialize, Debug, Default, Clone)]
pub struct RunPayload {
#[serde(default)]
pub version: u32,
pub env_name: String,
pub env_path: String,
pub command: String,
#[serde(default)]
pub args: Vec<String>,
}
impl RunPayload {
pub fn new(env_name: String, env_path: String, command: String, args: Vec<String>) -> Self {
Self {
version: RUN_PAYLOAD_VERSION,
env_name,
env_path,
command,
args,
}
}
pub fn read_from_stdin() -> anyhow::Result<Self> {
use std::io::Read;
let mut buf = String::new();
std::io::stdin()
.read_to_string(&mut buf)
.context("Could not read run payload from stdin")?;
serde_json::from_str(&buf).context("Could not parse run payload as JSON")
}
}