openai_client_cli/program/loaders/
parameter.rs1use crate::{Entry, Error, Result, traits::*};
2use serde::{Deserialize, Serialize};
3use std::{fs::File, path::Path, str::FromStr};
4use tracing::{debug, info};
5
6#[derive(Clone, Deserialize, Serialize)]
8#[serde(transparent)]
9pub struct Parameter(serde_json::Value);
10
11impl Parameter {
12 pub fn from_slice(slice: &[u8]) -> Result<Self> {
14 Ok(serde_json::from_slice(slice)?)
15 }
16
17 fn post_fetch_ok(self, source: &str) -> Result<Self> {
18 info!(
19 "Successfully fetched the API request parameters from {}: <JSON Object ({} bytes)>",
20 source,
21 self.value_ref().to_string().len(),
22 );
23 Ok(self)
24 }
25}
26
27impl FromFile for Parameter {
28 fn from_file<P>(path: P) -> Result<Self>
29 where
30 P: AsRef<Path>,
31 {
32 Ok(serde_json::from_reader(File::open(path)?)?)
33 }
34}
35
36impl FromStr for Parameter {
37 type Err = Error;
38
39 fn from_str(text: &str) -> Result<Self> {
40 Ok(serde_json::from_str(text)?)
41 }
42}
43
44impl Loader<serde_json::Value> for Parameter {
45 fn fetch(entry: &Entry) -> Result<Self> {
46 for path in [
47 entry.parameter_file.as_ref(),
48 Some(&"openai.json".into()),
49 Some(&"openai-parameters.json".into()),
50 Some(&"openai_parameters.json".into()),
51 Some(&"openai-parameters".into()),
52 Some(&"openai_parameters".into()),
53 Some(&"openai.config.json".into()),
54 ]
55 .into_iter()
56 .flatten()
57 {
58 let source = &format!("the file {path:?}");
59 match Parameter::from_file(path) {
60 Ok(parameter) => return parameter.post_fetch_ok(source),
61 Err(err) => debug!("Failed to obtain the API request parameters from {source}: {err:?}"),
62 }
63 }
64 Err(Error::msg("Failed to fetch the API request parameters"))
65 }
66 fn value(self) -> serde_json::Value {
67 self.0
68 }
69 fn value_ref(&self) -> &serde_json::Value {
70 &self.0
71 }
72}
73
74impl From<serde_json::Value> for Parameter {
75 fn from(value: serde_json::Value) -> Self {
76 Self(value)
77 }
78}
79
80impl From<&serde_json::Value> for Parameter {
81 fn from(value: &serde_json::Value) -> Self {
82 Self(value.clone())
83 }
84}
85
86impl TryFrom<&str> for Parameter {
87 type Error = Error;
88
89 fn try_from(text: &str) -> Result<Self> {
90 Self::from_str(text)
91 }
92}
93
94impl TryFrom<String> for Parameter {
95 type Error = Error;
96
97 fn try_from(text: String) -> Result<Self> {
98 Self::from_str(&text)
99 }
100}
101
102impl TryFrom<&String> for Parameter {
103 type Error = Error;
104
105 fn try_from(text: &String) -> Result<Self> {
106 Self::from_str(text)
107 }
108}
109
110impl TryFrom<&[u8]> for Parameter {
111 type Error = Error;
112
113 fn try_from(text: &[u8]) -> Result<Self> {
114 Self::from_slice(text)
115 }
116}