Files
nix-output/src/action.rs
2025-11-15 07:54:29 +00:00

162 lines
3.0 KiB
Rust

use std::borrow::Cow;
use std::fmt::Display;
use std::ops::Deref;
use color_eyre::eyre::Context;
use serde::Deserialize;
use serde_repr::Deserialize_repr;
use crate::action_raw::RawAction;
// ---
// --- ActionType
// ---
#[derive(Clone, Copy, Debug, Deserialize_repr)]
#[repr(u8)]
#[derive(Eq, PartialEq)]
#[derive(Default)]
pub enum ActionType {
#[default]
Unknown = 0,
CopyPath = 100,
FileTransfer = 101,
Realise = 102,
CopyPaths = 103,
Builds = 104,
Build = 105,
OptimiseStore = 106,
VerifyPaths = 107,
Substitute = 108,
QueryPathInfo = 109,
PostBuildHook = 110,
BuildWaiting = 111,
FetchTree = 112,
}
// ---
// --- BuildStepId
// ---
#[derive(Copy, Clone, Debug, Default, Deserialize, Eq, PartialEq, Hash)]
pub struct BuildStepId(u64);
impl Deref for BuildStepId {
type Target = u64;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl From<u64> for BuildStepId {
fn from(value: u64) -> Self {
Self(value)
}
}
impl From<BuildStepId> for u64 {
fn from(val: BuildStepId) -> Self {
val.0
}
}
impl Display for BuildStepId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
// ---
// --- Action
// ---
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum StartFields<'a> {
Unknown,
CopyPath {
path: Cow<'a, str>,
origin: Cow<'a, str>,
destination: Cow<'a, str>,
},
FileTransfer {
target: Cow<'a, str>,
},
Realise,
CopyPaths,
Builds,
Build {
target: Cow<'a, str>,
source: Cow<'a, str>, // TODO: check
val1: u64,
val2: u64,
},
OptimiseStore,
VerifyPaths,
Substitute {
source: Cow<'a, str>,
target: Cow<'a, str>,
},
QueryPathInfo {
path: Cow<'a, str>,
source: Cow<'a, str>,
},
PostBuildHook,
BuildWaiting,
FetchTree,
}
#[derive(Debug, Eq, PartialEq)]
pub enum ResultFields<'a> {
FileLinked {
val1: u64,
val2: u64,
},
BuildLogLine(Cow<'a, str>),
UntrustedPath(Cow<'a, str>),
CorruptedPath(Cow<'a, str>),
SetPhase(&'a str),
Progress {
done: u64,
expected: u64,
running: u64,
failed: u64,
},
SetExpected {
action: ActionType,
expected: u64,
},
PostBuildLogLine(Cow<'a, str>),
FetchStatus(Cow<'a, str>),
}
#[derive(Debug, Eq, PartialEq)]
pub enum Action<'a> {
Msg {
level: u8,
msg: Cow<'a, str>,
},
Start {
start_type: StartFields<'a>,
id: BuildStepId,
level: u8,
parent: BuildStepId,
text: Cow<'a, str>,
},
Result {
id: BuildStepId,
fields: ResultFields<'a>,
},
Stop {
id: BuildStepId,
},
}
impl<'a> Action<'a> {
pub fn parse(buf: &'a str) -> color_eyre::Result<Self> {
let raw: RawAction = serde_json::from_str(buf).context("Could not parse raw JSON")?;
raw.try_into().context("Could not convert raw action")
}
}