parse_mediawiki_sql/
utils.rs1use std::{
7 fs::File,
8 path::{Path, PathBuf},
9};
10
11use thiserror::Error;
12
13pub use memmap2::Mmap;
14
15pub unsafe fn memory_map<P: AsRef<Path>>(path: P) -> Result<Mmap, Error> {
29 let path = path.as_ref();
30 Mmap::map(&File::open(path).map_err(|source| Error::from_io("open file", source, path))?)
31 .map_err(|source| Error::from_io("memory map file", source, path))
32}
33
34#[derive(Debug, Error)]
36#[error("Failed to {action} at {}", path.canonicalize().as_ref().unwrap_or(path).display())]
37pub struct Error {
38 action: &'static str,
39 source: std::io::Error,
40 path: PathBuf,
41}
42
43impl Error {
44 pub fn from_io<P: Into<PathBuf>>(
45 action: &'static str,
46 source: std::io::Error,
47 path: P,
48 ) -> Self {
49 Error {
50 action,
51 source,
52 path: path.into(),
53 }
54 }
55}
56
57pub use mwtitle::{NamespaceMap, Title};
58
59pub trait NamespaceMapExt {
60 fn pretty_title(
61 &self,
62 namespace: crate::field_types::PageNamespace,
63 title: &crate::field_types::PageTitle,
64 ) -> String;
65}
66
67impl NamespaceMapExt for NamespaceMap {
68 fn pretty_title(
69 &self,
70 namespace: crate::field_types::PageNamespace,
71 title: &crate::field_types::PageTitle,
72 ) -> String {
73 self.to_pretty(&Title::new_unchecked(
74 namespace.into_inner(),
75 <&String>::from(title),
76 ))
77 .expect("invalid namespace ID")
78 }
79}