nihility_rpc/proto/
execute.rs

1use crate::error::NihilityRpcError;
2use prost::Message;
3use std::ops::Deref;
4
5tonic::include_proto!("nihility.execute");
6
7#[derive(Debug, Clone)]
8pub enum AudioEndiannessType {
9    LittleEndian,
10    BigEndian,
11}
12
13#[derive(Debug, Clone)]
14pub struct AudioData {
15    pub sample_rate: u32,
16    pub sample_size: u32,
17    pub channels: u32,
18    pub sign: bool,
19    pub byte_order: AudioEndiannessType,
20    pub data: Vec<f32>,
21}
22
23#[derive(Debug, Clone)]
24pub enum ExecuteData {
25    String(String),
26    Audio(AudioData),
27}
28
29impl TryFrom<ExecuteRequest> for ExecuteData {
30    type Error = NihilityRpcError;
31
32    fn try_from(value: ExecuteRequest) -> Result<Self, Self::Error> {
33        match value.r#type() {
34            ExecuteType::String => Ok(ExecuteData::String(String::from_utf8(value.payload)?)),
35            ExecuteType::Audio => Ok(ExecuteData::Audio(
36                AudioChunk::decode(value.payload.deref())?.into(),
37            )),
38        }
39    }
40}
41
42impl From<ExecuteData> for ExecuteRequest {
43    fn from(value: ExecuteData) -> Self {
44        match value {
45            ExecuteData::String(string_value) => ExecuteRequest {
46                r#type: ExecuteType::String.into(),
47                payload: string_value.into_bytes(),
48            },
49            ExecuteData::Audio(audio_data) => ExecuteRequest {
50                r#type: ExecuteType::Audio.into(),
51                payload: AudioChunk::from(audio_data).encode_to_vec(),
52            },
53        }
54    }
55}
56
57impl TryFrom<ExecuteResponse> for ExecuteData {
58    type Error = NihilityRpcError;
59
60    fn try_from(value: ExecuteResponse) -> Result<Self, Self::Error> {
61        match value.r#type() {
62            ExecuteType::String => Ok(ExecuteData::String(String::from_utf8(value.payload)?)),
63            ExecuteType::Audio => Ok(ExecuteData::Audio(
64                AudioChunk::decode(value.payload.deref())?.into(),
65            )),
66        }
67    }
68}
69
70impl From<ExecuteData> for ExecuteResponse {
71    fn from(value: ExecuteData) -> Self {
72        match value {
73            ExecuteData::String(string_value) => ExecuteResponse {
74                r#type: ExecuteType::String.into(),
75                payload: string_value.into_bytes(),
76            },
77            ExecuteData::Audio(audio_data) => ExecuteResponse {
78                r#type: ExecuteType::Audio.into(),
79                payload: AudioChunk::from(audio_data).encode_to_vec(),
80            },
81        }
82    }
83}
84
85impl From<AudioData> for AudioChunk {
86    fn from(value: AudioData) -> Self {
87        AudioChunk {
88            sample_rate: value.sample_rate,
89            sample_size: value.sample_size,
90            channels: value.channels,
91            sign: value.sign,
92            byte_order: match value.byte_order {
93                AudioEndiannessType::LittleEndian => AudioEndianness::Little.into(),
94                AudioEndiannessType::BigEndian => AudioEndianness::Big.into(),
95            },
96            data: value.data,
97        }
98    }
99}
100
101impl From<AudioChunk> for AudioData {
102    fn from(value: AudioChunk) -> Self {
103        AudioData {
104            sample_rate: value.sample_rate,
105            sample_size: value.sample_size,
106            channels: value.channels,
107            sign: value.sign,
108            byte_order: match value.byte_order() {
109                AudioEndianness::Big => AudioEndiannessType::BigEndian,
110                AudioEndianness::Little => AudioEndiannessType::LittleEndian,
111            },
112            data: value.data,
113        }
114    }
115}
116
117impl Default for AudioData {
118    fn default() -> Self {
119        AudioData {
120            sample_rate: 32000,
121            sample_size: 16,
122            channels: 1,
123            sign: true,
124            byte_order: AudioEndiannessType::LittleEndian,
125            data: vec![],
126        }
127    }
128}