Start paring ris law overview

This commit is contained in:
2023-11-03 22:40:19 +01:00
parent 1aa664b536
commit 23e2de9d42
6 changed files with 584 additions and 2 deletions

59
src/law/hits.rs Normal file
View 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
View 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", &current_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(())
}

View File

@ -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);
}