mod builder;
mod filter;
pub use builder::{Builder, Query};
use reqwest::header::{HeaderMap, HeaderValue, IntoHeaderName};
use reqwest::Client;
#[derive(Clone, Debug)]
pub struct Postgrest {
url: String,
schema: Option<String>,
headers: HeaderMap,
client: Client,
}
impl Postgrest {
pub fn new<T>(url: T) -> Self
where
T: Into<String>,
{
Postgrest {
url: url.into(),
schema: None,
headers: HeaderMap::new(),
client: Client::new(),
}
}
pub fn new_with_client<T>(url: T, client: Client) -> Self
where
T: Into<String>,
{
Postgrest {
url: url.into(),
schema: None,
headers: HeaderMap::new(),
client,
}
}
pub fn schema<T>(mut self, schema: T) -> Self
where
T: Into<String>,
{
self.schema = Some(schema.into());
self
}
pub fn insert_header(
mut self,
header_name: impl IntoHeaderName,
header_value: impl AsRef<str>,
) -> Self {
self.headers.insert(
header_name,
HeaderValue::from_str(header_value.as_ref()).expect("Invalid header value."),
);
self
}
pub fn from<T>(&self, table: T) -> Builder
where
T: AsRef<str>,
{
let url = format!("{}/{}", self.url, table.as_ref());
Builder::new(
url,
self.schema.clone(),
self.headers.clone(),
self.client.clone(),
)
}
pub fn rpc<T, U>(&self, function: T, params: U) -> Builder
where
T: AsRef<str>,
U: Into<String>,
{
let url = format!("{}/rpc/{}", self.url, function.as_ref());
Builder::new(
url,
self.schema.clone(),
self.headers.clone(),
self.client.clone(),
)
.rpc(params)
}
}
#[cfg(test)]
mod tests {
use super::*;
const REST_URL: &str = "http://localhost:3000";
#[test]
fn initialize() {
assert_eq!(Postgrest::new(REST_URL).url, REST_URL);
}
#[test]
fn switch_schema() {
assert_eq!(
Postgrest::new(REST_URL).schema("private").schema,
Some("private".to_string())
);
}
#[test]
fn with_insert_header() {
assert_eq!(
Postgrest::new(REST_URL)
.insert_header("apikey", "super.secret.key")
.headers
.get("apikey")
.unwrap(),
"super.secret.key"
);
}
}