hubspot-rust-sdk 0.4.4

A HubSpot SKD for Rust. This SDK is designed to be a simple and easy to use interface for the HubSpot API.
Documentation
use serde::Serialize;
use serde_json::{json, Value};
use crate::universals::{client::HubSpotClient, pagination::{CreateBody, PaginationBodyParams, TurnPageMethod}, requests::HttpMethod};
use super::types::{HubSpotObject, HubSpotObjectType};

#[derive(Debug, Serialize)]
pub struct FilterGroup {
    pub filters: Vec<Filter>,
}

#[derive(Debug, Serialize)]
pub struct Filter {
    #[serde(rename = "propertyName")]
    pub property_name: String,
    pub operator: String,
    pub value: String,
}

impl HubSpotClient {
    pub async fn search(
        &self,
        object_type: HubSpotObjectType,
        filter: Vec<FilterGroup>,
        properties: Vec<&str>,
        max_amount: Option<usize>
    ) -> Result<Vec<HubSpotObject>, String> {
        self.request_with_pagination(
            format!("/crm/v3/objects/{object_type}/search"),
            HttpMethod::Post,
            Some(CreateBody {
                static_body: json!({
                    "filterGroups": filter,
                    "properties": properties,
                }),
                create_body
            }),
            max_amount,
            get_after_pagination
        ).await
    }
}

fn create_body(
    mut static_body: Value,
    dynamic_params: PaginationBodyParams
) -> Value {
    if let Some(after) = dynamic_params.after {
        static_body["after"] = json!(after);
    }
    if let Some(limit) = dynamic_params.limit {
        static_body["limit"] = json!(limit);
    }
    static_body
}

pub fn get_after_pagination(body: &Value) -> Option<TurnPageMethod> {
    match body["paging"]["next"]["after"].as_str() {
        Some(after) => match after.parse::<usize>() {
            Ok(after) => return Some(TurnPageMethod::After(after)),
            Err(_) => None,
        },
        None => None,
    }
}