openssh_mux_client/
utils.rs

1use std::convert::TryInto;
2
3use serde::{Serialize, Serializer};
4
5use super::{NonZeroByteSlice, Result};
6
7/// Serialize one `u32` as ssh_format.
8pub(crate) fn serialize_u32(int: u32) -> [u8; 4] {
9    int.to_be_bytes()
10}
11
12pub(crate) enum MaybeOwned<'a, T> {
13    Owned(T),
14    Borrowed(&'a T),
15}
16
17impl<T> MaybeOwned<'_, T> {
18    pub(crate) fn as_ref(&self) -> &T {
19        use MaybeOwned::*;
20
21        match self {
22            Owned(val) => val,
23            Borrowed(reference) => reference,
24        }
25    }
26}
27
28impl<T: Serialize> Serialize for MaybeOwned<'_, T> {
29    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
30        self.as_ref().serialize(serializer)
31    }
32}
33
34pub(crate) trait SliceExt {
35    fn get_len_as_u32(&self) -> Result<u32>;
36}
37
38impl<T> SliceExt for [T] {
39    fn get_len_as_u32(&self) -> Result<u32> {
40        self.len()
41            .try_into()
42            .map_err(|_| ssh_format::Error::TooLong.into())
43    }
44}
45
46impl SliceExt for str {
47    fn get_len_as_u32(&self) -> Result<u32> {
48        self.as_bytes().get_len_as_u32()
49    }
50}
51
52impl SliceExt for NonZeroByteSlice {
53    fn get_len_as_u32(&self) -> Result<u32> {
54        self.into_inner().get_len_as_u32()
55    }
56}