Moved crates & added 2 endpoints
This commit is contained in:
parent
55af3e1455
commit
41d421b082
|
@ -99,15 +99,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "construct"
|
name = "construct"
|
||||||
version = "0.1.0"
|
version = "1.2.0"
|
||||||
dependencies = [
|
|
||||||
"construct-http",
|
|
||||||
"reqwest",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "construct-http"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"construct-models",
|
"construct-models",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "1"
|
resolver = "1"
|
||||||
members = ["construct", "construct-http", "construct-models", "examples"]
|
members = ["construct", "construct-models", "examples"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
authors = ["perp"]
|
authors = ["perp"]
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "construct-http"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2021"
|
|
||||||
authors.workspace = true
|
|
||||||
license.workspace = true
|
|
||||||
repository.workspace = true
|
|
||||||
keywords.workspace = true
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
async-trait = "0.1.80"
|
|
||||||
construct-models = { path = "../construct-models" }
|
|
||||||
reqwest = { version = "0.12.4", features = ["json", "socks"] }
|
|
||||||
serde = { version = "1.0.202", features = ["derive"] }
|
|
|
@ -1,36 +0,0 @@
|
||||||
use construct_models::account::Account;
|
|
||||||
|
|
||||||
use crate::prelude::*;
|
|
||||||
|
|
||||||
/// Account endpoint group
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct AccountGroup {
|
|
||||||
client: reqwest::Client,
|
|
||||||
api_id: String,
|
|
||||||
api_secret: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AccountGroup {
|
|
||||||
/// Return a new [`AccountGroup`]
|
|
||||||
pub fn new(client: reqwest::Client, api_id: &str, api_secret: &str) -> Self {
|
|
||||||
Self {
|
|
||||||
client,
|
|
||||||
api_id: api_id.to_string(),
|
|
||||||
api_secret: api_secret.to_string(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return information about your account
|
|
||||||
pub async fn fetch(&self) -> Result<Account> {
|
|
||||||
Ok(self
|
|
||||||
.client
|
|
||||||
.get(format!("{}/v1/account", BASE_URL))
|
|
||||||
.basic_auth(&self.api_id, Some(&self.api_secret))
|
|
||||||
.send()
|
|
||||||
.await?
|
|
||||||
.process_error()
|
|
||||||
.await?
|
|
||||||
.json()
|
|
||||||
.await?)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
use async_trait::async_trait;
|
|
||||||
use construct_models::Error;
|
|
||||||
|
|
||||||
pub mod account;
|
|
||||||
|
|
||||||
pub(crate) mod prelude {
|
|
||||||
pub(crate) use crate::{ResponseExt, Result, BASE_URL};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Base URL of Censys API
|
|
||||||
pub const BASE_URL: &str = "https://search.censys.io/api";
|
|
||||||
|
|
||||||
/// Custom error Result type
|
|
||||||
pub type Result<T> = std::result::Result<T, Error>;
|
|
||||||
|
|
||||||
/// Handle response error
|
|
||||||
#[async_trait]
|
|
||||||
trait ResponseExt {
|
|
||||||
async fn process_error(self) -> Result<Self>
|
|
||||||
where
|
|
||||||
Self: Sized;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Match response status code
|
|
||||||
/// and handle the error
|
|
||||||
#[async_trait]
|
|
||||||
impl ResponseExt for reqwest::Response {
|
|
||||||
async fn process_error(self) -> Result<Self>
|
|
||||||
where
|
|
||||||
Self: Sized,
|
|
||||||
{
|
|
||||||
match self.status().as_u16() {
|
|
||||||
200 => Ok(self),
|
|
||||||
_ => Err(Error::API(self.json().await?)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "construct"
|
name = "construct"
|
||||||
version = "0.1.0"
|
version = "1.2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
@ -8,5 +8,7 @@ repository.workspace = true
|
||||||
keywords.workspace = true
|
keywords.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
construct-http = { path = "../construct-http" }
|
async-trait = "0.1.80"
|
||||||
reqwest = { version = "0.12.4", features = ["socks"] }
|
construct-models = { path = "../construct-models" }
|
||||||
|
reqwest = { version = "0.12.4", features = ["json", "socks"] }
|
||||||
|
serde = { version = "1.0.202", features = ["derive"] }
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
use construct_models::account::Account;
|
||||||
|
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
impl Construct {
|
||||||
|
/// Returns information about your account
|
||||||
|
pub async fn fetch_account(&self) -> Result<Account> {
|
||||||
|
Ok(self
|
||||||
|
.client
|
||||||
|
.get(format!("{}/v1/account", self.base_url))
|
||||||
|
.basic_auth(&self.api_id, Some(&self.api_secret))
|
||||||
|
.send()
|
||||||
|
.await?
|
||||||
|
.process_error()
|
||||||
|
.await?
|
||||||
|
.json()
|
||||||
|
.await?)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,49 @@
|
||||||
use construct_http::account::AccountGroup;
|
use async_trait::async_trait;
|
||||||
|
use construct_models::Error;
|
||||||
|
|
||||||
|
pub mod account;
|
||||||
|
pub mod metadata;
|
||||||
|
|
||||||
|
pub(crate) mod prelude {
|
||||||
|
pub(crate) use crate::{Construct, ResponseExt, Result};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Base URL of Censys API
|
||||||
|
const BASE_URL: &str = "https://search.censys.io/api";
|
||||||
|
|
||||||
|
/// Custom error Result type
|
||||||
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
|
/// Handle response error
|
||||||
|
#[async_trait]
|
||||||
|
trait ResponseExt {
|
||||||
|
async fn process_error(self) -> Result<Self>
|
||||||
|
where
|
||||||
|
Self: Sized;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Match response status code
|
||||||
|
/// and handle the error
|
||||||
|
#[async_trait]
|
||||||
|
impl ResponseExt for reqwest::Response {
|
||||||
|
async fn process_error(self) -> Result<Self>
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
{
|
||||||
|
match self.status().as_u16() {
|
||||||
|
200 => Ok(self),
|
||||||
|
_ => Err(Error::API(self.json().await?)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Construct client
|
/// Construct client
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Construct {
|
pub struct Construct {
|
||||||
pub account: AccountGroup,
|
client: reqwest::Client,
|
||||||
|
base_url: String,
|
||||||
|
api_id: String,
|
||||||
|
api_secret: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Construct {
|
impl Construct {
|
||||||
|
@ -16,7 +56,10 @@ impl Construct {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
account: AccountGroup::new(client, api_id, api_secret),
|
client,
|
||||||
|
base_url: BASE_URL.to_owned(),
|
||||||
|
api_id: api_id.to_owned(),
|
||||||
|
api_secret: api_secret.to_owned(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
use construct_models::metadata::Hosts;
|
||||||
|
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
impl Construct {
|
||||||
|
/// Returns host metadata about what Censys scans for
|
||||||
|
pub async fn fetch_metadata_hosts(&self) -> Result<Hosts> {
|
||||||
|
Ok(self
|
||||||
|
.client
|
||||||
|
.get(format!("{}/v2/metadata/hosts", self.base_url))
|
||||||
|
.basic_auth(&self.api_id, Some(&self.api_secret))
|
||||||
|
.send()
|
||||||
|
.await?
|
||||||
|
.process_error()
|
||||||
|
.await?
|
||||||
|
.json()
|
||||||
|
.await?)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
pub(crate) mod hosts;
|
|
@ -6,6 +6,6 @@ async fn main() {
|
||||||
let construct = Construct::new("id", "secret");
|
let construct = Construct::new("id", "secret");
|
||||||
|
|
||||||
// Fetch account information
|
// Fetch account information
|
||||||
let account = construct.account.fetch().await.unwrap();
|
let account = construct.fetch_account().await.unwrap();
|
||||||
println!("{:#?}", account);
|
println!("{:#?}", account);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue