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}