nix_remote/
stderr.rs

1//! Log messages from the nix daemon.
2//!
3//! Nix propagates error messages from the daemon to the client using the following pattern:
4//! - the daemon reads a worker op from the client,
5//! - the daemon sends one or more stderr messages to the client. Each message consists of
6//!   a 64-bit opcode followed by the body of the message. The final message has the opcode `Last`.
7//! - the daemon sends the reply to the worker op.
8
9use serde::{Deserialize, Serialize};
10use serde_bytes::ByteBuf;
11use tagged_serde::TaggedSerde;
12
13use crate::{NixString, Result};
14
15/// The different stderr messages.
16///
17/// On the wire, they are represented as the opcode followed by the body.
18///
19// STDERR_READ is... interesting. Fortunately, it appears to have been superceded by FramedSource.
20// It is not used in the current version of the nix protocol
21// Read = 0x64617461,
22#[derive(Debug, TaggedSerde, PartialEq, Clone, Eq)]
23pub enum Msg {
24    #[tagged_serde = 0x64617416]
25    Write(NixString),
26    #[tagged_serde = 0x63787470]
27    Error(StderrError),
28    #[tagged_serde = 0x6f6c6d67]
29    Next(NixString),
30    #[tagged_serde = 0x53545254]
31    StartActivity(StderrStartActivity),
32    #[tagged_serde = 0x53544f50]
33    StopActivity(u64),
34    #[tagged_serde = 0x52534c54]
35    Result(StderrResult),
36    #[tagged_serde = 0x616c7473]
37    Last(()),
38}
39
40#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
41pub struct StderrError {
42    typ: ByteBuf,
43    level: u64,
44    name: ByteBuf,
45    message: ByteBuf,
46    have_pos: u64,
47    traces: Vec<Trace>,
48}
49
50#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
51pub struct StderrStartActivity {
52    act: u64,
53    lvl: u64,
54    typ: u64,
55    s: ByteBuf,
56    fields: LoggerFields,
57    parent: u64,
58}
59
60#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
61pub struct StderrResult {
62    act: u64,
63    typ: u64,
64    fields: LoggerFields,
65}
66
67#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
68struct Trace {
69    have_pos: u64,
70    trace: ByteBuf,
71}
72
73#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
74struct LoggerFields {
75    fields: Vec<LoggerField>,
76}
77
78#[derive(Debug, TaggedSerde, Clone, PartialEq, Eq)]
79enum LoggerField {
80    #[tagged_serde = 0]
81    Int(u64),
82    #[tagged_serde = 1]
83    String(ByteBuf),
84}