#builder-pattern #data #abs #statistics #analysis #requests #extract

abs-data

使用这个直观的库利用澳大利亚统计局(ABS)的SDMX API进行数据提取和分析

8次发布

0.2.1 2023年11月5日
0.2.0 2023年11月5日
0.1.5 2023年10月11日

#23 in #builder-pattern

Download history 4/week @ 2024-03-09 1/week @ 2024-03-16 5/week @ 2024-03-30 1/week @ 2024-05-18

61 每月下载量

MIT 许可证

55KB
1.5K SLoC

ABS数据API Rust客户端

这个Rust库提供了一种方便的方式与澳大利亚统计局(ABS)数据API https://api.gov.au/assets/APIs/abs/DataAPI.openapi.html 进行交互。它利用构建器类型对API进行流畅的请求。

免责声明

  • 非官方:此库未得到澳大利亚政府在任何形式的认可、赞助或推广。
  • alpha:此库目前处于alpha阶段且不完全。此外,它所依赖的API也处于beta阶段。

功能

  • 请求构建器模式:使用构建器类型构建请求是流畅的。
  • 强类型模型:为ABS接口提供强类型模型,最小化运行时错误。

示例

将以下内容添加到您的 Cargo.toml

[dependencies]
abs_data = "0.2.1"

示例请求

use abs_data::{
    builders::{
        dataflow_identifier_builder::DataflowIdentifierBuilder,
        datakey_builder::DataKeyBuilder, sdmx_data_request_builder::SdmxDataRequestBuilder,
        sdmx_meta_request_builder::SdmxMetaRequestBuilder,
    },
    models::typed::{
        datakey::DataKey, datakey_dimension::DataKeyDimension, detail::Detail, period::Period,
        structure_type::StructureType,
    },
    result::Result,
};

async fn get_dynamic_meta_and_use_for_request() -> Result<()> {
    let meta_response = SdmxMetaRequestBuilder::new(&StructureType::DataFlow)
        .build()
        .send()
        .await?;

    let dataflow = &meta_response.data.dataflows.unwrap()[10]; // Select desired dataflow

    let dataflow_identifier = DataflowIdentifierBuilder::new(&dataflow.id)
        .agency_id(&dataflow.agency_id)
        .version(&dataflow.version)
        .build();

    let _response = SdmxDataRequestBuilder::new(&dataflow_identifier)
        .detail(&Detail::DataOnly)
        .start_period(&Period::Year(2012))
        .end_period(&Period::Year(2022))
        .build()
        .send()
        .await?;

    Ok(())
}

async fn get_all_data_for_structure_id_without_filter() -> Result<()> {
    let dataflow_identifier = DataflowIdentifierBuilder::new("CPI").build();

    let _response = SdmxDataRequestBuilder::new(&dataflow_identifier) // Avoid 500 response with data only detail (issue with beta api)
        .build()
        .send()
        .await?;

    Ok(())
}

async fn get_datakeys_for_structure_id() -> Result<()> {
    let dataflow_identifier = DataflowIdentifierBuilder::new("CPI").build();

    let _response = SdmxDataRequestBuilder::new(&dataflow_identifier)
        .detail(&Detail::SeriesKeysOnly)
        .build()
        .send()
        .await?;

    Ok(())
}

async fn get_data_with_custom_datakey() -> Result<()> {
    let dataflow_identifier = DataflowIdentifierBuilder::new("CPI").build();

    let _response = SdmxDataRequestBuilder::new(&dataflow_identifier)
        .data_key(&DataKey::parse("1.40066.10.8.Q")?)
        .detail(&Detail::DataOnly)
        .build()
        .send()
        .await?;

    Ok(())
}

async fn get_data_with_datakey_builder_validation() -> Result<()> {
    let dataflow_identifier = DataflowIdentifierBuilder::new("CPI").build();

    let key = DataKeyBuilder::new(&dataflow_identifier)
        .add(&DataKeyDimension::new("MEASURE", "1"))
        .add(&DataKeyDimension::new("INDEX", "40066"))
        .add(&DataKeyDimension::new("REGION", "8"))
        .add(&DataKeyDimension::new("FREQ", "Q"))
        .add(&DataKeyDimension::new("TSEST", "10"))
        .build()
        .await?;

    assert_eq!(key, DataKey::parse("1.40066.10.8.Q")?);

    let _response = SdmxDataRequestBuilder::new(&dataflow_identifier)
        .data_key(&key)
        .detail(&Detail::DataOnly)
        .build()
        .send()
        .await?;

    Ok(())
}

依赖项

~5–20MB
~274K SLoC