#![deny(clippy::all)]
#![deny(clippy::pedantic)]
#![deny(missing_docs)]
#![deny(warnings)]
mod date_de;
mod error;
mod methods;
mod model;
mod params;
#[cfg(feature = "rng")]
pub mod rand;
mod request_builders;
mod requests;
mod results;
pub mod version;
use methods::Method;
pub use model::{AllowedCharacters, ApiKey, ApiKeyStatus, Request, RequestId, Response};
pub use request_builders::{
RequestBlobs, RequestDecimalFractions, RequestGaussians, RequestIntegers, RequestStrings,
RequestUUIDs,
};
use requests::{
EmptyRequest, GenerateBlobsRequest, GenerateDecimalFractionsRequest, GenerateGaussiansRequest,
GenerateIntegersRequest, GenerateStringsRequest, GenerateUUIDsRequest,
};
pub use results::{
GenerateBlobsResult, GenerateDecimalFractionsResult, GenerateGaussiansResult,
GenerateIntegersResult, GenerateStringsResult, GenerateUUIDsResult, GetUsageResult, RandomData,
RandomResult,
};
pub use error::{Error, ErrorCode, ResponseError, Result};
const API_INVOKE: &str = "https://api.random.org/json-rpc/2/invoke";
macro_rules! make_request {
($api:ident, $body:expr) => {{
$api.client.post(API_INVOKE).json($body).send()
}};
}
macro_rules! request {
($api:ident, $request:ident) => {
Ok(make_request!($api, &$request)?.json()?)
};
}
#[derive(Debug, Clone)]
pub struct Random {
client: reqwest::blocking::Client,
api_key: ApiKey,
}
impl Random {
pub fn new<S: Into<String>>(api_key: S) -> Random {
Random {
client: reqwest::blocking::Client::new(),
api_key: ApiKey(api_key.into()),
}
}
pub fn request_integers(&self) -> RequestIntegers {
RequestIntegers::new(self)
}
pub fn request_decimal_fractions(&self) -> RequestDecimalFractions {
RequestDecimalFractions::new(self)
}
pub fn request_gaussians(&self) -> RequestGaussians {
RequestGaussians::new(self)
}
pub fn request_strings(&self) -> RequestStrings {
RequestStrings::new(self)
}
pub fn request_uuids(&self) -> RequestUUIDs {
RequestUUIDs::new(self)
}
pub fn request_blobs(&self) -> RequestBlobs {
RequestBlobs::new(self)
}
pub fn generate_integers(
&self,
min: i32,
max: i32,
limit: u16,
replacement: bool,
) -> Result<Response<GenerateIntegersResult>> {
let request =
GenerateIntegersRequest::new(self.api_key.clone(), min, max, limit, replacement);
request!(self, request)
}
pub fn generate_decimal_fractions(
&self,
limit: u16,
decimal_places: u8,
) -> Result<Response<GenerateDecimalFractionsResult>> {
let request =
GenerateDecimalFractionsRequest::new(self.api_key.clone(), limit, decimal_places);
request!(self, request)
}
pub fn generate_gaussians(
&self,
limit: u16,
mean: i32,
standard_deviation: i32,
significant_digits: u8,
) -> Result<Response<GenerateGaussiansResult>> {
let request = GenerateGaussiansRequest::new(
self.api_key.clone(),
limit,
mean,
standard_deviation,
significant_digits,
);
request!(self, request)
}
pub fn generate_strings(
&self,
limit: u16,
length: u8,
characters: AllowedCharacters,
) -> Result<Response<GenerateStringsResult>> {
let request = GenerateStringsRequest::new(self.api_key.clone(), limit, length, characters);
request!(self, request)
}
pub fn generate_uuids(&self, limit: u16) -> Result<Response<GenerateUUIDsResult>> {
let request = GenerateUUIDsRequest::new(self.api_key.clone(), limit);
request!(self, request)
}
pub fn generate_blobs(&self, limit: u16, size: u32) -> Result<Response<GenerateBlobsResult>> {
let request = GenerateBlobsRequest::new(self.api_key.clone(), limit, size);
request!(self, request)
}
pub fn get_usage(&self) -> Result<Response<GetUsageResult>> {
let request = EmptyRequest::new(Method::GetUsage, self.api_key.clone());
request!(self, request)
}
}
#[cfg(test)]
mod tests {
fn assert_sync_and_send<T: Sync + Send>() {}
#[test]
fn test_sync_and_send() {
assert_sync_and_send::<crate::Random>();
}
}