This commit is contained in:
2023-11-04 13:49:59 +01:00
parent 023d8cf073
commit 58dd701c95
5 changed files with 68 additions and 40 deletions

View File

@ -1,17 +1,18 @@
mod parser;
use crate::{par::parser::Risdok, Error};
use crate::{law::LawBuilder, par::parser::Risdok, Error};
fn fetch_page(url: &str) -> Result<String, Error> {
Ok(ureq::get(url).call()?.into_string()?)
}
pub(crate) fn parse(url: &str) -> Result<(), Error> {
pub(crate) fn parse(url: &str, builder: &mut LawBuilder) -> Result<(), Error> {
println!("{url}");
let xml = fetch_page(url)?;
let risdok = Risdok::from_str(&xml)?;
let risdok = Risdok::from_str(&xml, builder)?;
println!("{risdok}");
println!("{builder:#?}");
//println!("{risdok}");
Ok(())
}

View File

@ -2,7 +2,7 @@ use std::fmt::Display;
use roxmltree::Node;
use crate::Error;
use crate::{law::LawBuilder, Error};
#[derive(Debug, PartialEq)]
pub(crate) struct Risdok {
@ -12,14 +12,14 @@ pub(crate) struct Risdok {
}
impl Risdok {
pub(crate) fn parse(n: Node) -> Self {
pub(crate) fn parse(n: Node, builder: &mut LawBuilder) -> Self {
assert!(n.tag_name().name() == "risdok");
let mut c = n.children();
let ret = Self {
metadaten: Metadaten::parse(c.next().unwrap()),
nutzdaten: Nutzdaten::parse(c.next().unwrap()),
nutzdaten: Nutzdaten::parse(c.next().unwrap(), builder),
layoutdaten: Layoutdaten::parse(c.next().unwrap()),
};
@ -28,11 +28,11 @@ impl Risdok {
ret
}
pub(crate) fn from_str(xml: &str) -> Result<Self, Error> {
pub(crate) fn from_str(xml: &str, builder: &mut LawBuilder) -> Result<Self, Error> {
let doc = roxmltree::Document::parse(&xml)?;
let root = doc.root();
assert_eq!(root.children().into_iter().count(), 1);
Ok(Self::parse(root.children().next().unwrap()))
Ok(Self::parse(root.children().next().unwrap(), builder))
}
}
@ -70,12 +70,12 @@ pub(crate) struct Nutzdaten {
abschnitt: Abschnitt,
}
impl Nutzdaten {
pub(crate) fn parse(n: Node) -> Self {
pub(crate) fn parse(n: Node, builder: &mut LawBuilder) -> Self {
assert!(n.tag_name().name() == "nutzdaten");
let mut c = n.children();
let ret = Self {
abschnitt: Abschnitt::parse(c.next().unwrap()),
abschnitt: Abschnitt::parse(c.next().unwrap(), builder),
};
assert_eq!(c.next(), None);
@ -86,12 +86,11 @@ impl Nutzdaten {
#[derive(Debug, PartialEq)]
pub(crate) struct Abschnitt {
ueberschrifts: Vec<Ueberschrift>,
ueberschriftPara: Option<Ueberschrift>,
absatze: Vec<AbsatzAbs>,
}
impl Abschnitt {
pub(crate) fn parse(n: Node) -> Self {
pub(crate) fn parse(n: Node, builder: &mut LawBuilder) -> Self {
assert!(n.tag_name().name() == "abschnitt");
let mut c = n.children().peekable();
@ -119,16 +118,18 @@ impl Abschnitt {
}
}
let mut ueberschrifts = Vec::new();
loop {
match &c.peek() {
match c.peek() {
Some(child) => {
if Ueberschrift::test(&child, "g1") {
ueberschrifts.push(Ueberschrift::parse(c.next().unwrap(), "g1"));
let ueberschrift = Ueberschrift::parse(c.next().unwrap(), "g1");
builder.new_header(&ueberschrift.content);
} else if Ueberschrift::test(&child, "g2") {
ueberschrifts.push(Ueberschrift::parse(c.next().unwrap(), "g2"));
let ueberschrift = Ueberschrift::parse(c.next().unwrap(), "g2");
builder.new_desc(&ueberschrift.content);
} else if Ueberschrift::test(&child, "g1min") {
ueberschrifts.push(Ueberschrift::parse(c.next().unwrap(), "g1min"));
let ueberschrift = Ueberschrift::parse(c.next().unwrap(), "g1min");
builder.new_header(&ueberschrift.content);
} else {
break;
}
@ -181,7 +182,6 @@ impl Abschnitt {
Self {
ueberschriftPara,
absatze,
ueberschrifts,
}
}
}