openai_client_cli/program/loaders/
parameter.rs

1use crate::{Entry, Error, Result, traits::*};
2use serde::{Deserialize, Serialize};
3use std::{fs::File, path::Path, str::FromStr};
4use tracing::{debug, info};
5
6/// The API request parameters.
7#[derive(Clone, Deserialize, Serialize)]
8#[serde(transparent)]
9pub struct Parameter(serde_json::Value);
10
11impl Parameter {
12  /// Create a new parameter object from bytes of JSON.
13  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}