nihility_rpc/proto/
execute.rs1use 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}