snops 0.1.0

The snarkops control plane responsible for managing environments and agents
use std::net::IpAddr;

use snops_common::state::{AgentState, InternedId};

use crate::state::Agent;

#[derive(Clone, serde::Serialize, serde::Deserialize)]
pub struct AgentStatusResponse {
    pub agent_id: InternedId,
    pub is_connected: bool,
    pub is_computing: bool,
    pub external_ip: Option<IpAddr>,
    pub internal_ip: Option<IpAddr>,
    pub state: AgentState,
}

impl From<&Agent> for AgentStatusResponse {
    fn from(agent: &Agent) -> Self {
        Self {
            agent_id: agent.id(),
            is_connected: agent.is_connected(),
            is_computing: agent.is_compute_claimed(),
            external_ip: agent.addrs().and_then(|a| a.external),
            internal_ip: agent.addrs().and_then(|a| a.internal.first().cloned()),
            state: agent.state().clone(),
        }
    }
}