Add errors for tile loading

This commit is contained in:
Maximilian Ammann 2021-12-09 17:11:32 +01:00
parent d2b2abc827
commit 60c6ec66d1
3 changed files with 41 additions and 10 deletions

View File

@ -0,0 +1,21 @@
use std::io;
use protobuf::ProtobufError;
#[derive(Debug)]
pub enum Error {
Generic(String),
Protobuf(ProtobufError),
IO(io::Error),
}
impl From<ProtobufError> for Error {
fn from(err: ProtobufError) -> Self {
Error::Protobuf(err)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error::IO(err)
}
}

View File

@ -1,11 +1,12 @@
use std::fs::File;
use std::io;
use std::io::{BufReader, Read};
use std::io::{BufRead, BufReader, Read};
use std::path::{Path};
use protobuf::Message;
use crate::encoding::Decode;
use crate::error::Error;
use crate::protos::vector_tile::Tile as TileProto;
use crate::tile::Tile;
@ -18,15 +19,19 @@ mod tests;
pub mod geometry;
pub mod tile;
pub mod grid;
pub mod error;
pub fn parse_tile<P: AsRef<Path>>(path: P) -> io::Result<Tile> {
pub fn parse_tile<P: AsRef<Path>>(path: P) -> Result<Tile, Error> {
let mut f = File::open(path)?;
let mut reader = BufReader::new(f);
return Ok(parse_tile_reader(&mut reader));
parse_tile_reader(&mut reader).into()
}
pub fn parse_tile_reader(reader: &mut dyn Read) -> Tile {
let proto_tile = TileProto::parse_from_reader(reader).unwrap();
return proto_tile.decode();
pub fn parse_tile_reader<B: BufRead>(reader: &mut B) -> Result<Tile, Error> {
if reader.fill_buf()?.is_empty() {
return Err(Error::Generic("input must not be empty".to_string()));
}
let proto_tile = TileProto::parse_from_reader(reader)?;
Ok(proto_tile.decode())
}

View File

@ -1,11 +1,11 @@
use std::fs::File;
use std::io::BufReader;
use std::io::{BufReader, Cursor};
use protobuf::Message;
use crate::encoding::Decode;
use crate::grid::{GOOGLE_MERCATOR, tile_coordinates_bavaria};
use crate::parse_tile;
use crate::grid::{google_mercator, tile_coordinates_bavaria};
use crate::{parse_tile, parse_tile_reader};
use crate::protos::vector_tile::Tile;
#[test]
@ -15,5 +15,10 @@ fn test_parsing_europe_pbf() {
#[test]
fn test_tile_coordinates_bavaria() {
println!("{:?}", tile_coordinates_bavaria(&GOOGLE_MERCATOR, 6));
println!("{:?}", tile_coordinates_bavaria(&google_mercator(), 6));
}
#[test]
fn test_empty_fail() {
assert!(parse_tile_reader(&mut Cursor::new(&[])).is_err())
}