Start paring ris law overview
This commit is contained in:
59
src/law/hits.rs
Normal file
59
src/law/hits.rs
Normal file
@ -0,0 +1,59 @@
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub(crate) struct Hits {
|
||||
#[serde(
|
||||
rename = "@pageNumber",
|
||||
deserialize_with = "deserialize_string_to_usize"
|
||||
)]
|
||||
page_number: usize,
|
||||
#[serde(rename = "@pageSize", deserialize_with = "deserialize_string_to_usize")]
|
||||
page_size: usize,
|
||||
#[serde(rename = "#text", deserialize_with = "deserialize_string_to_usize")]
|
||||
text: usize,
|
||||
}
|
||||
|
||||
fn deserialize_string_to_usize<'de, D>(deserializer: D) -> Result<usize, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
let s = String::deserialize(deserializer)?;
|
||||
s.parse().map_err(serde::de::Error::custom)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct Wrapper {
|
||||
hits: Hits,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deserialize_hits_success() {
|
||||
let json = "{\"hits\": {
|
||||
\"@pageNumber\": \"1\",
|
||||
\"@pageSize\": \"100\",
|
||||
\"#text\": \"32\"}}";
|
||||
|
||||
let wrapper: serde_json::Result<Wrapper> = serde_json::from_str(json);
|
||||
assert!(wrapper.is_ok());
|
||||
|
||||
let wrapper = wrapper.unwrap();
|
||||
assert_eq!(wrapper.hits.page_number, 1);
|
||||
assert_eq!(wrapper.hits.page_size, 100);
|
||||
assert_eq!(wrapper.hits.text, 32);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deserialize_hits_failure() {
|
||||
let json = "{\"hits\": {
|
||||
\"@pageNumber\": \"one\",
|
||||
\"@pageSize\": \"one hundred\",
|
||||
\"#text\": \"thirty-two\"}}";
|
||||
|
||||
let wrapper: serde_json::Result<Wrapper> = serde_json::from_str(json);
|
||||
assert!(wrapper.is_err());
|
||||
}
|
||||
}
|
56
src/law/mod.rs
Normal file
56
src/law/mod.rs
Normal file
@ -0,0 +1,56 @@
|
||||
mod hits;
|
||||
|
||||
use serde::Deserialize;
|
||||
use time::{format_description, OffsetDateTime};
|
||||
|
||||
use crate::Error;
|
||||
|
||||
use self::hits::Hits;
|
||||
|
||||
fn current_date() -> String {
|
||||
let local_date = OffsetDateTime::now_utc();
|
||||
let format = format_description::parse("[year]-[month]-[day]").unwrap(); //OK
|
||||
local_date.format(&format).expect("Failed to format date")
|
||||
}
|
||||
|
||||
fn fetch_page(law_id: usize) -> Result<String, Error> {
|
||||
Ok(
|
||||
ureq::post("https://data.bka.gv.at/ris/api/v2.6/Bundesrecht")
|
||||
.send_form(&[
|
||||
("Applikation", "BrKons"),
|
||||
("Gesetzesnummer", &format!("{}", law_id)),
|
||||
("DokumenteProSeite", "OneHundred"),
|
||||
("Seitennummer", &format!("{}", 1)),
|
||||
("Fassung.FassungVom", ¤t_date()),
|
||||
])?
|
||||
.into_string()?,
|
||||
)
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct OgdSearchResult {
|
||||
#[serde(rename = "OgdSearchResult")]
|
||||
ogd_document_results: OgdDocumentResults,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct OgdDocumentResults {
|
||||
hits: Hits,
|
||||
#[serde(rename = "OgdDocumentReference")]
|
||||
ogd_document_reference: OgdDocumentReference,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct OgdDocumentReference {
|
||||
#[serde(rename = "Data")]
|
||||
data: Vec<Data>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct Data {}
|
||||
|
||||
pub(crate) fn parse(law_id: usize) -> Result<(), Error> {
|
||||
let result = fetch_page(law_id)?;
|
||||
println!("{result:#?}");
|
||||
Ok(())
|
||||
}
|
27
src/main.rs
27
src/main.rs
@ -1,3 +1,26 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
use std::io;
|
||||
|
||||
mod law;
|
||||
|
||||
pub struct Error {
|
||||
msg: String,
|
||||
}
|
||||
|
||||
impl From<ureq::Error> for Error {
|
||||
fn from(value: ureq::Error) -> Self {
|
||||
Self {
|
||||
msg: value.to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl From<io::Error> for Error {
|
||||
fn from(value: io::Error) -> Self {
|
||||
Self {
|
||||
msg: value.to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
law::parse(10001905);
|
||||
}
|
||||
|
Reference in New Issue
Block a user