Skip to main content
myrmic.dev

myrmic_common/cells/
mod.rs

1//! Cell identity, messaging, spawning, and lifecycle wire types.
2
3use alloc::string::String;
4use alloc::vec::Vec;
5use serde::{Deserialize, Serialize};
6
7pub use ids::{Sri, Srn};
8pub use names::{Command, Event};
9pub use naming::{NameError, ROOT_NS, child_sri, resolve_target, sri_of_path, validate_segment};
10
11mod ids;
12mod names;
13pub mod naming;
14pub mod spawn_ref;
15
16// Cell query error codes
17/// Command error code: no response within the timeout.
18pub const ERR_CELL_CMD_TIMEOUT: i32 = -7;
19/// Command error code: the target cell is not present in the system.
20pub const ERR_CELL_CMD_CELL_NOT_PRESENT: i32 = -2;
21/// Command error code: the cell exists but has no such command, or the
22/// arguments don't match what it expects.
23pub const ERR_CELL_CMD_COMMAND_NOT_PRESENT: i32 = -3;
24/// Command error code: the receiving cell crashed or errored while handling
25/// the command.
26pub const ERR_CELL_CMD_CELL_ERROR: i32 = -4;
27/// Command error code: an internal framework error.
28pub const ERR_CELL_CMD_INTERNAL: i32 = -5;
29/// Command error code: the provided buffer was too small for the response.
30pub const ERR_CELL_CMD_SMALL_BUFFER: i32 = -6;
31/// Error code: a request or response failed to (de)serialize.
32pub const ERR_SERIALISATION: i32 = -127;
33
34/// Represents the request to send a command to a cell
35#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for CommandRequest {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private229::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "CommandRequest", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "sri", &self.sri)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "command", &self.command)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "payload", &self.payload)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for CommandRequest {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private229::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private229::Ok(__Field::__field0),
                            1u64 => _serde::__private229::Ok(__Field::__field1),
                            2u64 => _serde::__private229::Ok(__Field::__field2),
                            _ => _serde::__private229::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "sri" => _serde::__private229::Ok(__Field::__field0),
                            "command" => _serde::__private229::Ok(__Field::__field1),
                            "payload" => _serde::__private229::Ok(__Field::__field2),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"sri" => _serde::__private229::Ok(__Field::__field0),
                            b"command" => _serde::__private229::Ok(__Field::__field1),
                            b"payload" => _serde::__private229::Ok(__Field::__field2),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private229::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private229::PhantomData<CommandRequest>,
                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = CommandRequest;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "struct CommandRequest")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<Sri>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct CommandRequest with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Command>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct CommandRequest with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Option<Vec<u8>>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct CommandRequest with 3 elements")),
                            };
                        _serde::__private229::Ok(CommandRequest {
                                sri: __field0,
                                command: __field1,
                                payload: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private229::Option<Sri> =
                            _serde::__private229::None;
                        let mut __field1: _serde::__private229::Option<Command> =
                            _serde::__private229::None;
                        let mut __field2:
                                _serde::__private229::Option<Option<Vec<u8>>> =
                            _serde::__private229::None;
                        while let _serde::__private229::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private229::Option::is_some(&__field0) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("sri"));
                                    }
                                    __field0 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Sri>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private229::Option::is_some(&__field1) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("command"));
                                    }
                                    __field1 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Command>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private229::Option::is_some(&__field2) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("payload"));
                                    }
                                    __field2 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<Vec<u8>>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private229::Some(__field0) => __field0,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("sri")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private229::Some(__field1) => __field1,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("command")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private229::Some(__field2) => __field2,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("payload")?,
                            };
                        _serde::__private229::Ok(CommandRequest {
                                sri: __field0,
                                command: __field1,
                                payload: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["sri", "command", "payload"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "CommandRequest", FIELDS,
                    __Visitor {
                        marker: _serde::__private229::PhantomData::<CommandRequest>,
                        lifetime: _serde::__private229::PhantomData,
                    })
            }
        }
    };Deserialize, #[automatically_derived]
#[allow(missing_docs)]
impl ::core::fmt::Debug for CommandRequest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "CommandRequest", "sri", &self.sri, "command", &self.command,
            "payload", &&self.payload)
    }
}Debug)]
36#[allow(missing_docs)]
37pub struct CommandRequest {
38    pub sri: Sri,
39    pub command: Command,
40    /// The encoded command payload; `None` for payload-less commands.
41    pub payload: Option<Vec<u8>>,
42}
43
44/// Represents the request to publish an event
45#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for EventPublishRequest {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private229::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "EventPublishRequest", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "event", &self.event)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "payload", &self.payload)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for EventPublishRequest {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private229::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private229::Ok(__Field::__field0),
                            1u64 => _serde::__private229::Ok(__Field::__field1),
                            _ => _serde::__private229::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "event" => _serde::__private229::Ok(__Field::__field0),
                            "payload" => _serde::__private229::Ok(__Field::__field1),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"event" => _serde::__private229::Ok(__Field::__field0),
                            b"payload" => _serde::__private229::Ok(__Field::__field1),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private229::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private229::PhantomData<EventPublishRequest>,
                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = EventPublishRequest;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "struct EventPublishRequest")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<Event>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct EventPublishRequest with 2 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Option<Vec<u8>>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct EventPublishRequest with 2 elements")),
                            };
                        _serde::__private229::Ok(EventPublishRequest {
                                event: __field0,
                                payload: __field1,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private229::Option<Event> =
                            _serde::__private229::None;
                        let mut __field1:
                                _serde::__private229::Option<Option<Vec<u8>>> =
                            _serde::__private229::None;
                        while let _serde::__private229::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private229::Option::is_some(&__field0) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("event"));
                                    }
                                    __field0 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Event>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private229::Option::is_some(&__field1) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("payload"));
                                    }
                                    __field1 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<Vec<u8>>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private229::Some(__field0) => __field0,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("event")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private229::Some(__field1) => __field1,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("payload")?,
                            };
                        _serde::__private229::Ok(EventPublishRequest {
                                event: __field0,
                                payload: __field1,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["event", "payload"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "EventPublishRequest", FIELDS,
                    __Visitor {
                        marker: _serde::__private229::PhantomData::<EventPublishRequest>,
                        lifetime: _serde::__private229::PhantomData,
                    })
            }
        }
    };Deserialize, #[automatically_derived]
#[allow(missing_docs)]
impl ::core::fmt::Debug for EventPublishRequest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "EventPublishRequest", "event", &self.event, "payload",
            &&self.payload)
    }
}Debug)]
46#[allow(missing_docs)]
47pub struct EventPublishRequest {
48    pub event: Event,
49    /// The encoded event payload; `None` for payload-less events.
50    pub payload: Option<Vec<u8>>,
51}
52
53/// Represents the request to create a timer (periodic interval or one-shot delay).
54#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for CreateTimerRequest {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private229::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "CreateTimerRequest", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "export_name", &self.export_name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "delay_ms", &self.delay_ms)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "period_ms", &self.period_ms)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "count", &self.count)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "fixed_delay", &self.fixed_delay)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for CreateTimerRequest {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private229::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private229::Ok(__Field::__field0),
                            1u64 => _serde::__private229::Ok(__Field::__field1),
                            2u64 => _serde::__private229::Ok(__Field::__field2),
                            3u64 => _serde::__private229::Ok(__Field::__field3),
                            4u64 => _serde::__private229::Ok(__Field::__field4),
                            _ => _serde::__private229::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "export_name" =>
                                _serde::__private229::Ok(__Field::__field0),
                            "delay_ms" => _serde::__private229::Ok(__Field::__field1),
                            "period_ms" => _serde::__private229::Ok(__Field::__field2),
                            "count" => _serde::__private229::Ok(__Field::__field3),
                            "fixed_delay" =>
                                _serde::__private229::Ok(__Field::__field4),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"export_name" =>
                                _serde::__private229::Ok(__Field::__field0),
                            b"delay_ms" => _serde::__private229::Ok(__Field::__field1),
                            b"period_ms" => _serde::__private229::Ok(__Field::__field2),
                            b"count" => _serde::__private229::Ok(__Field::__field3),
                            b"fixed_delay" =>
                                _serde::__private229::Ok(__Field::__field4),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private229::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private229::PhantomData<CreateTimerRequest>,
                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = CreateTimerRequest;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "struct CreateTimerRequest")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct CreateTimerRequest with 5 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<u64>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct CreateTimerRequest with 5 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<u64>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct CreateTimerRequest with 5 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<Option<u32>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct CreateTimerRequest with 5 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<bool>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct CreateTimerRequest with 5 elements")),
                            };
                        _serde::__private229::Ok(CreateTimerRequest {
                                export_name: __field0,
                                delay_ms: __field1,
                                period_ms: __field2,
                                count: __field3,
                                fixed_delay: __field4,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private229::Option<String> =
                            _serde::__private229::None;
                        let mut __field1: _serde::__private229::Option<u64> =
                            _serde::__private229::None;
                        let mut __field2: _serde::__private229::Option<u64> =
                            _serde::__private229::None;
                        let mut __field3:
                                _serde::__private229::Option<Option<u32>> =
                            _serde::__private229::None;
                        let mut __field4: _serde::__private229::Option<bool> =
                            _serde::__private229::None;
                        while let _serde::__private229::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private229::Option::is_some(&__field0) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("export_name"));
                                    }
                                    __field0 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private229::Option::is_some(&__field1) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("delay_ms"));
                                    }
                                    __field1 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<u64>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private229::Option::is_some(&__field2) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("period_ms"));
                                    }
                                    __field2 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<u64>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private229::Option::is_some(&__field3) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("count"));
                                    }
                                    __field3 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<u32>>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private229::Option::is_some(&__field4) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("fixed_delay"));
                                    }
                                    __field4 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<bool>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private229::Some(__field0) => __field0,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("export_name")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private229::Some(__field1) => __field1,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("delay_ms")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private229::Some(__field2) => __field2,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("period_ms")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private229::Some(__field3) => __field3,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("count")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private229::Some(__field4) => __field4,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("fixed_delay")?,
                            };
                        _serde::__private229::Ok(CreateTimerRequest {
                                export_name: __field0,
                                delay_ms: __field1,
                                period_ms: __field2,
                                count: __field3,
                                fixed_delay: __field4,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["export_name", "delay_ms", "period_ms", "count",
                                "fixed_delay"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "CreateTimerRequest", FIELDS,
                    __Visitor {
                        marker: _serde::__private229::PhantomData::<CreateTimerRequest>,
                        lifetime: _serde::__private229::PhantomData,
                    })
            }
        }
    };Deserialize, #[automatically_derived]
impl ::core::fmt::Debug for CreateTimerRequest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "CreateTimerRequest", "export_name", &self.export_name,
            "delay_ms", &self.delay_ms, "period_ms", &self.period_ms, "count",
            &self.count, "fixed_delay", &&self.fixed_delay)
    }
}Debug)]
55pub struct CreateTimerRequest {
56    /// The command export invoked on each tick.
57    pub export_name: String,
58    /// Delay before the first tick, in milliseconds.
59    pub delay_ms: u64,
60    /// Tick period in milliseconds; `0` for a one-shot delay.
61    pub period_ms: u64,
62    /// Maximum number of ticks; `None` runs until the cell stops.
63    pub count: Option<u32>,
64    /// When `true`, the period is measured from the end of one invocation to
65    /// the start of the next (fixed delay) rather than tick-to-tick (fixed
66    /// rate).
67    pub fixed_delay: bool,
68}
69
70/// A request to spawn a new cell instance at runtime.
71///
72/// Identifies a cell class either by content hash or by registered name.
73#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ClassRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Hash(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Hash",
                    &__self_0),
            Self::Name(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Name",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for ClassRef {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Hash(__self_0) =>
                Self::Hash(::core::clone::Clone::clone(__self_0)),
            Self::Name(__self_0) =>
                Self::Name(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ClassRef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private229::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ClassRef::Hash(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClassRef", 0u32, "Hash", __field0),
                    ClassRef::Name(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClassRef", 1u32, "Name", __field0),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for ClassRef {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private229::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private229::Ok(__Field::__field0),
                            1u64 => _serde::__private229::Ok(__Field::__field1),
                            _ =>
                                _serde::__private229::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 2")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "Hash" => _serde::__private229::Ok(__Field::__field0),
                            "Name" => _serde::__private229::Ok(__Field::__field1),
                            _ => {
                                _serde::__private229::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"Hash" => _serde::__private229::Ok(__Field::__field0),
                            b"Name" => _serde::__private229::Ok(__Field::__field1),
                            _ => {
                                let __value =
                                    &_serde::__private229::from_utf8_lossy(__value);
                                _serde::__private229::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private229::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private229::PhantomData<ClassRef>,
                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = ClassRef;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "enum ClassRef")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data) {
                            _serde::__private229::Ok((__Field::__field0, __variant)) =>
                                _serde::__private229::Result::map(_serde::de::VariantAccess::newtype_variant::<[u8; 32]>(__variant),
                                    ClassRef::Hash),
                            _serde::__private229::Ok((__Field::__field1, __variant)) =>
                                _serde::__private229::Result::map(_serde::de::VariantAccess::newtype_variant::<String>(__variant),
                                    ClassRef::Name),
                            _serde::__private229::Err(__err) =>
                                _serde::__private229::Err(__err),
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] = &["Hash", "Name"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "ClassRef", VARIANTS,
                    __Visitor {
                        marker: _serde::__private229::PhantomData::<ClassRef>,
                        lifetime: _serde::__private229::PhantomData,
                    })
            }
        }
    };Deserialize)]
74pub enum ClassRef {
75    /// SHA-256 content hash of the Wasm binary.
76    Hash([u8; 32]),
77    /// Registered class name.
78    Name(String),
79}
80
81/// Used by cells to create and deploy other cells via the `spawn_cell` host
82/// function.
83#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SpawnRequest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["class", "local_name", "tags", "arguments", "detached",
                        "grace_ms", "deadline_ms"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.class, &self.local_name, &self.tags, &self.arguments,
                        &self.detached, &self.grace_ms, &&self.deadline_ms];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "SpawnRequest",
            names, values)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for SpawnRequest {
    #[inline]
    fn clone(&self) -> Self {
        Self {
            class: ::core::clone::Clone::clone(&self.class),
            local_name: ::core::clone::Clone::clone(&self.local_name),
            tags: ::core::clone::Clone::clone(&self.tags),
            arguments: ::core::clone::Clone::clone(&self.arguments),
            detached: ::core::clone::Clone::clone(&self.detached),
            grace_ms: ::core::clone::Clone::clone(&self.grace_ms),
            deadline_ms: ::core::clone::Clone::clone(&self.deadline_ms),
        }
    }
}Clone, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for SpawnRequest {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private229::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "SpawnRequest",
                            false as usize + 1 + 1 + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "class", &self.class)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "local_name", &self.local_name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "tags", &self.tags)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "arguments", &self.arguments)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "detached", &self.detached)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "grace_ms", &self.grace_ms)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "deadline_ms", &self.deadline_ms)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for SpawnRequest {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private229::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __field5,
                    __field6,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private229::Ok(__Field::__field0),
                            1u64 => _serde::__private229::Ok(__Field::__field1),
                            2u64 => _serde::__private229::Ok(__Field::__field2),
                            3u64 => _serde::__private229::Ok(__Field::__field3),
                            4u64 => _serde::__private229::Ok(__Field::__field4),
                            5u64 => _serde::__private229::Ok(__Field::__field5),
                            6u64 => _serde::__private229::Ok(__Field::__field6),
                            _ => _serde::__private229::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "class" => _serde::__private229::Ok(__Field::__field0),
                            "local_name" => _serde::__private229::Ok(__Field::__field1),
                            "tags" => _serde::__private229::Ok(__Field::__field2),
                            "arguments" => _serde::__private229::Ok(__Field::__field3),
                            "detached" => _serde::__private229::Ok(__Field::__field4),
                            "grace_ms" => _serde::__private229::Ok(__Field::__field5),
                            "deadline_ms" =>
                                _serde::__private229::Ok(__Field::__field6),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"class" => _serde::__private229::Ok(__Field::__field0),
                            b"local_name" =>
                                _serde::__private229::Ok(__Field::__field1),
                            b"tags" => _serde::__private229::Ok(__Field::__field2),
                            b"arguments" => _serde::__private229::Ok(__Field::__field3),
                            b"detached" => _serde::__private229::Ok(__Field::__field4),
                            b"grace_ms" => _serde::__private229::Ok(__Field::__field5),
                            b"deadline_ms" =>
                                _serde::__private229::Ok(__Field::__field6),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private229::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private229::PhantomData<SpawnRequest>,
                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = SpawnRequest;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "struct SpawnRequest")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<ClassRef>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct SpawnRequest with 7 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Option<String>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct SpawnRequest with 7 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Option<Vec<String>>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct SpawnRequest with 7 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<Option<Vec<u8>>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct SpawnRequest with 7 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<bool>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct SpawnRequest with 7 elements")),
                            };
                        let __field5 =
                            match _serde::de::SeqAccess::next_element::<Option<u64>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(5usize,
                                                &"struct SpawnRequest with 7 elements")),
                            };
                        let __field6 =
                            match _serde::de::SeqAccess::next_element::<Option<u64>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(6usize,
                                                &"struct SpawnRequest with 7 elements")),
                            };
                        _serde::__private229::Ok(SpawnRequest {
                                class: __field0,
                                local_name: __field1,
                                tags: __field2,
                                arguments: __field3,
                                detached: __field4,
                                grace_ms: __field5,
                                deadline_ms: __field6,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private229::Option<ClassRef> =
                            _serde::__private229::None;
                        let mut __field1:
                                _serde::__private229::Option<Option<String>> =
                            _serde::__private229::None;
                        let mut __field2:
                                _serde::__private229::Option<Option<Vec<String>>> =
                            _serde::__private229::None;
                        let mut __field3:
                                _serde::__private229::Option<Option<Vec<u8>>> =
                            _serde::__private229::None;
                        let mut __field4: _serde::__private229::Option<bool> =
                            _serde::__private229::None;
                        let mut __field5:
                                _serde::__private229::Option<Option<u64>> =
                            _serde::__private229::None;
                        let mut __field6:
                                _serde::__private229::Option<Option<u64>> =
                            _serde::__private229::None;
                        while let _serde::__private229::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private229::Option::is_some(&__field0) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("class"));
                                    }
                                    __field0 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<ClassRef>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private229::Option::is_some(&__field1) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("local_name"));
                                    }
                                    __field1 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<String>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private229::Option::is_some(&__field2) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("tags"));
                                    }
                                    __field2 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<Vec<String>>>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private229::Option::is_some(&__field3) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("arguments"));
                                    }
                                    __field3 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<Vec<u8>>>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private229::Option::is_some(&__field4) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("detached"));
                                    }
                                    __field4 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<bool>(&mut __map)?);
                                }
                                __Field::__field5 => {
                                    if _serde::__private229::Option::is_some(&__field5) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("grace_ms"));
                                    }
                                    __field5 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<u64>>(&mut __map)?);
                                }
                                __Field::__field6 => {
                                    if _serde::__private229::Option::is_some(&__field6) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("deadline_ms"));
                                    }
                                    __field6 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<u64>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private229::Some(__field0) => __field0,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("class")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private229::Some(__field1) => __field1,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("local_name")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private229::Some(__field2) => __field2,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("tags")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private229::Some(__field3) => __field3,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("arguments")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private229::Some(__field4) => __field4,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("detached")?,
                            };
                        let __field5 =
                            match __field5 {
                                _serde::__private229::Some(__field5) => __field5,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("grace_ms")?,
                            };
                        let __field6 =
                            match __field6 {
                                _serde::__private229::Some(__field6) => __field6,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("deadline_ms")?,
                            };
                        _serde::__private229::Ok(SpawnRequest {
                                class: __field0,
                                local_name: __field1,
                                tags: __field2,
                                arguments: __field3,
                                detached: __field4,
                                grace_ms: __field5,
                                deadline_ms: __field6,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["class", "local_name", "tags", "arguments", "detached",
                                "grace_ms", "deadline_ms"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "SpawnRequest", FIELDS,
                    __Visitor {
                        marker: _serde::__private229::PhantomData::<SpawnRequest>,
                        lifetime: _serde::__private229::PhantomData,
                    })
            }
        }
    };Deserialize)]
84pub struct SpawnRequest {
85    /// The cell class to instantiate.
86    pub class: ClassRef,
87    /// Local name for the new cell, unique among the caller's children. The
88    /// host derives the child's SRI as `child_sri(caller_sri, local_name)` (see
89    /// [`crate::cells::naming`]); the caller never supplies a raw SRI.
90    pub local_name: Option<String>,
91    /// Optional placement tags constraining where the cell is deployed. If
92    /// `None`, no placement constraints are applied.
93    pub tags: Option<Vec<String>>,
94    /// Optional payload delivered to the child's `#[init]` handler as its
95    /// argument buffer. `None` (or empty) means the child must have a
96    /// no-payload `#[init]`; a non-empty buffer is decoded by the init
97    /// handler's `Decoder` param, exactly like a command payload.
98    pub arguments: Option<Vec<u8>>,
99    /// Decouples the child's lifetime from the caller's: no fencing against
100    /// the parent, excluded from cascades, no `cell_lost` on either side.
101    /// Declared only by the spawning parent.
102    pub detached: bool,
103    /// Per-edge fencing tolerance: how long the child outlives this cell's
104    /// silence before the runtime kills it. `None` = the cluster default.
105    pub grace_ms: Option<u64>,
106    /// Per-edge death deadline: how long the child's node must be silent
107    /// before it is declared dead (rows released, `cell_lost` sent). Short =
108    /// fast failover but misfires on slow reboots; long lets the child ride
109    /// one out. Clamped to at least twice the lease renewal period; `None` =
110    /// the cluster default.
111    pub deadline_ms: Option<u64>,
112}
113
114/// Host status code: the call succeeded.
115pub const STATUS_OK: core::ffi::c_int = 0;
116/// Spawn error code: no cell class with the given hash or name is registered.
117pub const SPAWN_ERR_CLASS_NOT_FOUND: core::ffi::c_int = -10;
118/// Spawn error code: the caller already has a child with that local name.
119pub const SPAWN_ERR_ALREADY_EXISTS: core::ffi::c_int = -11;
120/// Spawn error code: the deploy failed after the child's name was claimed.
121pub const SPAWN_ERR_DEPLOY_FAILED: core::ffi::c_int = -12;
122
123/// Errors that can occur when spawning a cell.
124#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SpawnError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                SpawnError::ClassNotFound => "ClassNotFound",
                SpawnError::AlreadyExists => "AlreadyExists",
                SpawnError::DeployFailed => "DeployFailed",
            })
    }
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for SpawnError { }
#[automatically_derived]
impl ::core::clone::Clone for SpawnError {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SpawnError { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for SpawnError { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SpawnError {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SpawnError { }Eq)]
125pub enum SpawnError {
126    /// No cell class with the given hash or name is registered.
127    ClassNotFound,
128    /// The caller already has a child with that local name.
129    AlreadyExists,
130    /// The deploy failed after the child's name was claimed.
131    DeployFailed,
132}
133
134impl TryFrom<core::ffi::c_int> for SpawnError {
135    type Error = core::ffi::c_int;
136
137    fn try_from(code: core::ffi::c_int) -> Result<Self, Self::Error> {
138        match code {
139            SPAWN_ERR_CLASS_NOT_FOUND => Ok(Self::ClassNotFound),
140            SPAWN_ERR_ALREADY_EXISTS => Ok(Self::AlreadyExists),
141            SPAWN_ERR_DEPLOY_FAILED => Ok(Self::DeployFailed),
142            _ => Err(code),
143        }
144    }
145}
146
147impl From<SpawnError> for &'static str {
148    fn from(err: SpawnError) -> Self {
149        match err {
150            SpawnError::ClassNotFound => "class not found",
151            SpawnError::AlreadyExists => "already exists",
152            SpawnError::DeployFailed => "deploy failed",
153        }
154    }
155}
156
157/// Reserved system command name carrying a [`CellLost`] payload. Routed to
158/// the guest's `on_cell_lost` export, never to a `command_*` handler. The
159/// guest-facing send path must reject names with this prefix so cells cannot
160/// spoof system notifications.
161pub const SYS_CELL_LOST: &str = "__sys_cell_lost";
162
163/// Prefix reserved for host-emitted system commands.
164pub const SYS_COMMAND_PREFIX: &str = "__sys";
165
166/// Why a cell died (spec §5).
167#[derive(#[automatically_derived]
impl ::core::fmt::Debug for LostReason {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::NodeLost =>
                ::core::fmt::Formatter::write_str(f, "NodeLost"),
            Self::Crashed => ::core::fmt::Formatter::write_str(f, "Crashed"),
            Self::Stopped { code: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Stopped", "code", &__self_0),
            Self::Terminated =>
                ::core::fmt::Formatter::write_str(f, "Terminated"),
            Self::SpawnFailed =>
                ::core::fmt::Formatter::write_str(f, "SpawnFailed"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for LostReason {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::NodeLost => Self::NodeLost,
            Self::Crashed => Self::Crashed,
            Self::Stopped { code: __self_0 } =>
                Self::Stopped { code: ::core::clone::Clone::clone(__self_0) },
            Self::Terminated => Self::Terminated,
            Self::SpawnFailed => Self::SpawnFailed,
        }
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LostReason { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LostReason {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Stopped { code: __self_0 }, Self::Stopped {
                    code: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LostReason {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Option<u32>>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for LostReason {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private229::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    LostReason::NodeLost =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "LostReason", 0u32, "NodeLost"),
                    LostReason::Crashed =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "LostReason", 1u32, "Crashed"),
                    LostReason::Stopped { ref code } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "LostReason", 2u32, "Stopped", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "code", code)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    LostReason::Terminated =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "LostReason", 3u32, "Terminated"),
                    LostReason::SpawnFailed =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "LostReason", 4u32, "SpawnFailed"),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for LostReason {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private229::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private229::Ok(__Field::__field0),
                            1u64 => _serde::__private229::Ok(__Field::__field1),
                            2u64 => _serde::__private229::Ok(__Field::__field2),
                            3u64 => _serde::__private229::Ok(__Field::__field3),
                            4u64 => _serde::__private229::Ok(__Field::__field4),
                            _ =>
                                _serde::__private229::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 5")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "NodeLost" => _serde::__private229::Ok(__Field::__field0),
                            "Crashed" => _serde::__private229::Ok(__Field::__field1),
                            "Stopped" => _serde::__private229::Ok(__Field::__field2),
                            "Terminated" => _serde::__private229::Ok(__Field::__field3),
                            "SpawnFailed" =>
                                _serde::__private229::Ok(__Field::__field4),
                            _ => {
                                _serde::__private229::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"NodeLost" => _serde::__private229::Ok(__Field::__field0),
                            b"Crashed" => _serde::__private229::Ok(__Field::__field1),
                            b"Stopped" => _serde::__private229::Ok(__Field::__field2),
                            b"Terminated" =>
                                _serde::__private229::Ok(__Field::__field3),
                            b"SpawnFailed" =>
                                _serde::__private229::Ok(__Field::__field4),
                            _ => {
                                let __value =
                                    &_serde::__private229::from_utf8_lossy(__value);
                                _serde::__private229::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private229::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private229::PhantomData<LostReason>,
                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = LostReason;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "enum LostReason")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data) {
                            _serde::__private229::Ok((__Field::__field0, __variant)) =>
                                {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private229::Ok(LostReason::NodeLost)
                            }
                            _serde::__private229::Ok((__Field::__field1, __variant)) =>
                                {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private229::Ok(LostReason::Crashed)
                            }
                            _serde::__private229::Ok((__Field::__field2, __variant)) =>
                                {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private229::Formatter)
                                        -> _serde::__private229::fmt::Result {
                                        _serde::__private229::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private229::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private229::Ok(__Field::__field0),
                                            _ => _serde::__private229::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private229::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "code" => _serde::__private229::Ok(__Field::__field0),
                                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private229::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"code" => _serde::__private229::Ok(__Field::__field0),
                                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private229::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private229::PhantomData<LostReason>,
                                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = LostReason;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private229::Formatter)
                                        -> _serde::__private229::fmt::Result {
                                        _serde::__private229::Formatter::write_str(__formatter,
                                            "struct variant LostReason::Stopped")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private229::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<Option<u32>>(&mut __seq)?
                                                {
                                                _serde::__private229::Some(__value) => __value,
                                                _serde::__private229::None =>
                                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant LostReason::Stopped with 1 element")),
                                            };
                                        _serde::__private229::Ok(LostReason::Stopped {
                                                code: __field0,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private229::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0:
                                                _serde::__private229::Option<Option<u32>> =
                                            _serde::__private229::None;
                                        while let _serde::__private229::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private229::Option::is_some(&__field0) {
                                                        return _serde::__private229::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("code"));
                                                    }
                                                    __field0 =
                                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<u32>>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private229::Some(__field0) => __field0,
                                                _serde::__private229::None =>
                                                    _serde::__private229::de::missing_field("code")?,
                                            };
                                        _serde::__private229::Ok(LostReason::Stopped {
                                                code: __field0,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] = &["code"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private229::PhantomData::<LostReason>,
                                        lifetime: _serde::__private229::PhantomData,
                                    })
                            }
                            _serde::__private229::Ok((__Field::__field3, __variant)) =>
                                {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private229::Ok(LostReason::Terminated)
                            }
                            _serde::__private229::Ok((__Field::__field4, __variant)) =>
                                {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private229::Ok(LostReason::SpawnFailed)
                            }
                            _serde::__private229::Err(__err) =>
                                _serde::__private229::Err(__err),
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["NodeLost", "Crashed", "Stopped", "Terminated",
                                "SpawnFailed"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "LostReason", VARIANTS,
                    __Visitor {
                        marker: _serde::__private229::PhantomData::<LostReason>,
                        lifetime: _serde::__private229::PhantomData,
                    })
            }
        }
    };Deserialize)]
168pub enum LostReason {
169    /// The cell's node lease expired.
170    NodeLost,
171    /// The cell's task ended without a deliberate undeploy (trap, panic,
172    /// runtime error). Its subtree died with it.
173    Crashed,
174    /// Deliberate `stop_self(code)`; the code is the cell's stated reason.
175    Stopped {
176        /// The exit code the cell passed to `stop_self`.
177        code: Option<u32>,
178    },
179    /// Killed by an ancestor's terminate or a cascade passing through.
180    Terminated,
181    /// A spawn this cell requested never came up: the deploy failed after
182    /// the child's name was claimed (placement, transfer, or exec failure).
183    /// Not sent for detached spawns; the spawn call also returns the error.
184    SpawnFailed,
185}
186
187/// Notification that a watched cell died. Today only parents receive these
188/// (for their children); the shape is deliberately cell-, not child-,
189/// centric so general monitoring can reuse it. Delivered as the payload of
190/// the reserved [`SYS_CELL_LOST`] command.
191#[derive(#[automatically_derived]
impl ::core::fmt::Debug for CellLost {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "CellLost",
            "cell", &self.cell, "local_name", &self.local_name, "reason",
            &&self.reason)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for CellLost {
    #[inline]
    fn clone(&self) -> Self {
        Self {
            cell: ::core::clone::Clone::clone(&self.cell),
            local_name: ::core::clone::Clone::clone(&self.local_name),
            reason: ::core::clone::Clone::clone(&self.reason),
        }
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CellLost { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CellLost {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        self.cell == other.cell && self.local_name == other.local_name &&
            self.reason == other.reason
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CellLost {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Sri>;
        let _: ::core::cmp::AssertParamIsEq<Option<String>>;
        let _: ::core::cmp::AssertParamIsEq<LostReason>;
    }
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for CellLost {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private229::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "CellLost", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "cell", &self.cell)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "local_name", &self.local_name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "reason", &self.reason)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for CellLost {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private229::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private229::Ok(__Field::__field0),
                            1u64 => _serde::__private229::Ok(__Field::__field1),
                            2u64 => _serde::__private229::Ok(__Field::__field2),
                            _ => _serde::__private229::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "cell" => _serde::__private229::Ok(__Field::__field0),
                            "local_name" => _serde::__private229::Ok(__Field::__field1),
                            "reason" => _serde::__private229::Ok(__Field::__field2),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private229::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"cell" => _serde::__private229::Ok(__Field::__field0),
                            b"local_name" =>
                                _serde::__private229::Ok(__Field::__field1),
                            b"reason" => _serde::__private229::Ok(__Field::__field2),
                            _ => { _serde::__private229::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private229::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private229::PhantomData<CellLost>,
                    lifetime: _serde::__private229::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = CellLost;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private229::Formatter)
                        -> _serde::__private229::fmt::Result {
                        _serde::__private229::Formatter::write_str(__formatter,
                            "struct CellLost")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<Sri>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct CellLost with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Option<String>>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct CellLost with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<LostReason>(&mut __seq)?
                                {
                                _serde::__private229::Some(__value) => __value,
                                _serde::__private229::None =>
                                    return _serde::__private229::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct CellLost with 3 elements")),
                            };
                        _serde::__private229::Ok(CellLost {
                                cell: __field0,
                                local_name: __field1,
                                reason: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private229::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private229::Option<Sri> =
                            _serde::__private229::None;
                        let mut __field1:
                                _serde::__private229::Option<Option<String>> =
                            _serde::__private229::None;
                        let mut __field2: _serde::__private229::Option<LostReason> =
                            _serde::__private229::None;
                        while let _serde::__private229::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private229::Option::is_some(&__field0) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("cell"));
                                    }
                                    __field0 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Sri>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private229::Option::is_some(&__field1) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("local_name"));
                                    }
                                    __field1 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<Option<String>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private229::Option::is_some(&__field2) {
                                        return _serde::__private229::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("reason"));
                                    }
                                    __field2 =
                                        _serde::__private229::Some(_serde::de::MapAccess::next_value::<LostReason>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private229::Some(__field0) => __field0,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("cell")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private229::Some(__field1) => __field1,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("local_name")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private229::Some(__field2) => __field2,
                                _serde::__private229::None =>
                                    _serde::__private229::de::missing_field("reason")?,
                            };
                        _serde::__private229::Ok(CellLost {
                                cell: __field0,
                                local_name: __field1,
                                reason: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["cell", "local_name", "reason"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "CellLost", FIELDS,
                    __Visitor {
                        marker: _serde::__private229::PhantomData::<CellLost>,
                        lifetime: _serde::__private229::PhantomData,
                    })
            }
        }
    };Deserialize)]
192pub struct CellLost {
193    /// The cell that died (never the receiver of the notification).
194    pub cell: Sri,
195    /// Spawn-time local name when known; `None` for external deploys.
196    /// Helpers need not rely on it — deterministic naming lets a parent
197    /// derive its children's SRIs from the names it spawned.
198    pub local_name: Option<String>,
199    /// Why the cell died.
200    pub reason: LostReason,
201}
202
203/// Terminate error code: no cell with the given SRI exists.
204pub const TERMINATE_ERR_NOT_FOUND: core::ffi::c_int = -20;
205/// Terminate error code: the undeploy step failed.
206pub const TERMINATE_ERR_UNDEPLOY_FAILED: core::ffi::c_int = -21;
207/// Terminate error code: erasing the cell's records failed.
208pub const TERMINATE_ERR_ERASE_FAILED: core::ffi::c_int = -22;
209/// Terminate error code: the target is not the caller or one of its
210/// descendants.
211pub const TERMINATE_ERR_NOT_PERMITTED: core::ffi::c_int = -23;
212
213/// Errors that can occur when terminating a cell.
214#[derive(#[automatically_derived]
impl ::core::fmt::Debug for TerminateError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                TerminateError::NotFound => "NotFound",
                TerminateError::UndeployFailed => "UndeployFailed",
                TerminateError::EraseFailed => "EraseFailed",
                TerminateError::NotPermitted => "NotPermitted",
            })
    }
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TerminateError { }
#[automatically_derived]
impl ::core::clone::Clone for TerminateError {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for TerminateError { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for TerminateError { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TerminateError {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TerminateError { }Eq)]
215pub enum TerminateError {
216    /// No cell with the given SRI exists.
217    NotFound,
218    /// The undeploy step failed.
219    UndeployFailed,
220    /// Erasing the cell's records failed.
221    EraseFailed,
222    /// The target is not the caller or one of its descendants — kill
223    /// authority is ancestry (spec §6).
224    NotPermitted,
225}
226
227impl TryFrom<core::ffi::c_int> for TerminateError {
228    type Error = core::ffi::c_int;
229
230    fn try_from(code: core::ffi::c_int) -> Result<Self, Self::Error> {
231        match code {
232            TERMINATE_ERR_NOT_FOUND => Ok(Self::NotFound),
233            TERMINATE_ERR_UNDEPLOY_FAILED => Ok(Self::UndeployFailed),
234            TERMINATE_ERR_ERASE_FAILED => Ok(Self::EraseFailed),
235            TERMINATE_ERR_NOT_PERMITTED => Ok(Self::NotPermitted),
236            _ => Err(code),
237        }
238    }
239}
240
241impl From<TerminateError> for &'static str {
242    fn from(err: TerminateError) -> Self {
243        match err {
244            TerminateError::NotFound => "not found",
245            TerminateError::UndeployFailed => "undeploy failed",
246            TerminateError::EraseFailed => "erase failed",
247            TerminateError::NotPermitted => "not permitted",
248        }
249    }
250}
251
252#[cfg(test)]
253mod cell_lost_tests {
254    use alloc::string::ToString;
255
256    use super::*;
257
258    #[test]
259    fn cell_lost_round_trips_all_reasons() {
260        for reason in [
261            LostReason::NodeLost,
262            LostReason::Crashed,
263            LostReason::Stopped { code: Some(3) },
264            LostReason::Stopped { code: None },
265            LostReason::Terminated,
266            LostReason::SpawnFailed,
267        ] {
268            let v = CellLost {
269                cell: sri_of_path("round-trip-test").unwrap().into(),
270                local_name: Some("pump".to_string()),
271                reason: reason.clone(),
272            };
273            let bytes = postcard::to_allocvec(&v).unwrap();
274            assert_eq!(postcard::from_bytes::<CellLost>(&bytes).unwrap(), v);
275        }
276    }
277
278    #[test]
279    fn sys_cell_lost_is_a_valid_command_name() {
280        assert!(Command::new(SYS_CELL_LOST.to_string()).is_ok());
281        assert!(SYS_CELL_LOST.starts_with(SYS_COMMAND_PREFIX));
282    }
283}