use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum CapacityKind {
UnicastSockets,
UdpBuffer,
PendingResponses,
RequestQueue,
ServiceRegistry,
}
impl CapacityKind {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::UnicastSockets => "unicast_sockets",
Self::UdpBuffer => "udp_buffer",
Self::PendingResponses => "pending_responses",
Self::RequestQueue => "request_queue",
Self::ServiceRegistry => "service_registry",
}
}
}
impl fmt::Display for CapacityKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tags_match_the_pre_0_11_string_literals() {
assert_eq!(CapacityKind::UnicastSockets.as_str(), "unicast_sockets");
assert_eq!(CapacityKind::UdpBuffer.as_str(), "udp_buffer");
assert_eq!(CapacityKind::PendingResponses.as_str(), "pending_responses");
assert_eq!(CapacityKind::RequestQueue.as_str(), "request_queue");
assert_eq!(CapacityKind::ServiceRegistry.as_str(), "service_registry");
}
#[test]
fn display_delegates_to_as_str() {
use core::fmt::Write as _;
struct Buf {
bytes: [u8; 32],
len: usize,
}
impl core::fmt::Write for Buf {
fn write_str(&mut self, s: &str) -> core::fmt::Result {
let end = self.len + s.len();
if end > self.bytes.len() {
return Err(core::fmt::Error);
}
self.bytes[self.len..end].copy_from_slice(s.as_bytes());
self.len = end;
Ok(())
}
}
for kind in [
CapacityKind::UnicastSockets,
CapacityKind::UdpBuffer,
CapacityKind::PendingResponses,
CapacityKind::RequestQueue,
CapacityKind::ServiceRegistry,
] {
let mut buf = Buf {
bytes: [0; 32],
len: 0,
};
write!(buf, "{kind}").expect("tag must fit the buffer");
let rendered = core::str::from_utf8(&buf.bytes[..buf.len]).expect("tags are ASCII");
assert_eq!(rendered, kind.as_str());
}
}
}