openssh_mux_client/
utils.rs
1use std::convert::TryInto;
2
3use serde::{Serialize, Serializer};
4
5use super::{NonZeroByteSlice, Result};
6
7pub(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}