Documentation
// Copyright (c) 2026, Salesforce, Inc.,
// All rights reserved.
// For full license text, see the LICENSE.txt file

#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RootCid(u32);

impl From<RootCid> for u32 {
    fn from(id: RootCid) -> Self {
        id.0
    }
}

impl From<u32> for RootCid {
    fn from(id: u32) -> Self {
        RootCid(id)
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct HttpCid(u32);

impl From<HttpCid> for u32 {
    fn from(id: HttpCid) -> Self {
        id.0
    }
}

impl From<u32> for HttpCid {
    fn from(id: u32) -> Self {
        HttpCid(id)
    }
}

// Context ID
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum Cid {
    Root(RootCid),
    Http(HttpCid),
}

impl From<&Cid> for u32 {
    fn from(value: &Cid) -> Self {
        match value {
            Cid::Root(id) => id.0,
            Cid::Http(id) => id.0,
        }
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RequestId(u32);

impl From<RequestId> for u32 {
    fn from(id: RequestId) -> Self {
        id.0
    }
}

impl From<u32> for RequestId {
    fn from(id: u32) -> Self {
        Self(id)
    }
}

impl From<Cid> for u32 {
    fn from(cid: Cid) -> Self {
        match cid {
            Cid::Root(id) => id.into(),
            Cid::Http(id) => id.into(),
        }
    }
}

impl From<HttpCid> for Cid {
    fn from(id: HttpCid) -> Self {
        Cid::Http(id)
    }
}

impl From<RootCid> for Cid {
    fn from(id: RootCid) -> Self {
        Cid::Root(id)
    }
}