oceanpkg/api/mod.rs
1//! Interfacing with Ocean's web API.
2
3use std::{
4 borrow::Cow,
5 env::{self, VarError},
6 ffi::{OsStr, OsString},
7};
8use url::Url;
9
10pub mod v1;
11
12/// The default URL to which API calls are made: `https://api.oceanpkg.org/`.
13pub const DEFAULT_URL: &str = "https://api.oceanpkg.org/";
14
15/// The environment variable key for using an alternative API URL:
16/// `OCEAN_API_URL`.
17pub const URL_ENV_KEY: &str = crate::env::OCEAN_API_URL;
18
19/// Returns the parsed `Url` value for [`URL_ENV_VAR`] or [`DEFAULT_URL`] if it
20/// does not exist.
21///
22/// [`URL_ENV_VAR`]: constant.URL_ENV_VAR.html
23/// [`DEFAULT_URL`]: constant.DEFAULT_URL.html
24pub fn url() -> Result<Url, url::ParseError> {
25 match url_str() {
26 Ok(url) => Url::parse(&url),
27 Err(_) => Err(url::ParseError::InvalidDomainCharacter),
28 }
29}
30
31/// Returns the UTF-8 encoded value for [`URL_ENV_VAR`] or [`DEFAULT_URL`] if it
32/// does not exist.
33///
34/// [`URL_ENV_VAR`]: constant.URL_ENV_VAR.html
35/// [`DEFAULT_URL`]: constant.DEFAULT_URL.html
36pub fn url_str() -> Result<Cow<'static, str>, OsString> {
37 match env::var(URL_ENV_KEY) {
38 Ok(var) => Ok(Cow::Owned(var)),
39 Err(VarError::NotPresent) => Ok(Cow::Borrowed(DEFAULT_URL)),
40 Err(VarError::NotUnicode(var)) => Err(var),
41 }
42}
43
44/// Returns the OS encoded value for [`URL_ENV_VAR`] or [`DEFAULT_URL`] if it
45/// does not exist.
46///
47/// [`URL_ENV_VAR`]: constant.URL_ENV_VAR.html
48/// [`DEFAULT_URL`]: constant.DEFAULT_URL.html
49pub fn url_os_str() -> Cow<'static, OsStr> {
50 if let Some(var) = env::var_os(URL_ENV_KEY) {
51 Cow::Owned(var)
52 } else {
53 Cow::Borrowed(DEFAULT_URL.as_ref())
54 }
55}