summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-07-21 12:27:40 +0200
committerLaurenz <laurmaedje@gmail.com>2021-07-21 12:27:40 +0200
commit929f4d64fef8054cbaf34d556467a7d2b9d09b47 (patch)
treeca2d071033659754db2e3e3a363431c1f9901d4d /src
parentb0e5212973ce2efcb1433323d67c06eea1a81785 (diff)
Switch Loader from Option to io::Result
Diffstat (limited to 'src')
-rw-r--r--src/eval/mod.rs4
-rw-r--r--src/font.rs2
-rw-r--r--src/image.rs2
-rw-r--r--src/loading/fs.rs13
-rw-r--r--src/loading/mod.rs16
5 files changed, 22 insertions, 15 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 9ec33b13..34986ffa 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -86,7 +86,7 @@ impl<'a> EvalContext<'a> {
/// Generates an error if the file is not found.
pub fn resolve(&mut self, path: &str, span: Span) -> Option<FileId> {
let base = *self.route.last()?;
- self.loader.resolve_from(base, Path::new(path)).or_else(|| {
+ self.loader.resolve_from(base, Path::new(path)).ok().or_else(|| {
self.diag(error!(span, "file not found"));
None
})
@@ -107,7 +107,7 @@ impl<'a> EvalContext<'a> {
return Some(id);
}
- let buffer = self.loader.load_file(id).or_else(|| {
+ let buffer = self.loader.load_file(id).ok().or_else(|| {
self.diag(error!(span, "failed to load file"));
None
})?;
diff --git a/src/font.rs b/src/font.rs
index 0d6cd880..93c21441 100644
--- a/src/font.rs
+++ b/src/font.rs
@@ -281,7 +281,7 @@ impl FontCache {
let buffer = match self.buffers.entry(file) {
Entry::Occupied(entry) => entry.into_mut(),
Entry::Vacant(entry) => {
- let buffer = self.loader.load_file(file)?;
+ let buffer = self.loader.load_file(file).ok()?;
entry.insert(Rc::new(buffer))
}
};
diff --git a/src/image.rs b/src/image.rs
index d0719ac7..5738be5f 100644
--- a/src/image.rs
+++ b/src/image.rs
@@ -74,7 +74,7 @@ impl ImageCache {
pub fn load(&mut self, file: FileId) -> Option<ImageId> {
let id = ImageId(file.into_raw());
if let Entry::Vacant(entry) = self.images.entry(id) {
- let buffer = self.loader.load_file(file)?;
+ let buffer = self.loader.load_file(file).ok()?;
let image = Image::parse(&buffer)?;
if let Some(callback) = &self.on_load {
callback(id, &image);
diff --git a/src/loading/fs.rs b/src/loading/fs.rs
index 407e2d94..0f6f1076 100644
--- a/src/loading/fs.rs
+++ b/src/loading/fs.rs
@@ -187,13 +187,16 @@ impl Loader for FsLoader {
&self.faces
}
- fn resolve_from(&self, base: FileId, path: &Path) -> Option<FileId> {
- let full = self.paths.borrow()[&base].parent()?.join(path);
- self.resolve(&full).ok()
+ fn resolve_from(&self, base: FileId, path: &Path) -> io::Result<FileId> {
+ let full = self.paths.borrow()[&base]
+ .parent()
+ .expect("base is a file")
+ .join(path);
+ self.resolve(&full)
}
- fn load_file(&self, id: FileId) -> Option<Vec<u8>> {
- fs::read(&self.paths.borrow()[&id]).ok()
+ fn load_file(&self, id: FileId) -> io::Result<Vec<u8>> {
+ fs::read(&self.paths.borrow()[&id])
}
}
diff --git a/src/loading/mod.rs b/src/loading/mod.rs
index 3be74428..64a65580 100644
--- a/src/loading/mod.rs
+++ b/src/loading/mod.rs
@@ -6,6 +6,7 @@ mod fs;
#[cfg(feature = "fs")]
pub use fs::*;
+use std::io;
use std::path::Path;
use serde::{Deserialize, Serialize};
@@ -21,10 +22,13 @@ pub trait Loader {
///
/// This should return the same id for all paths pointing to the same file
/// and `None` if the file does not exist.
- fn resolve_from(&self, base: FileId, path: &Path) -> Option<FileId>;
+ fn resolve_from(&self, base: FileId, path: &Path) -> io::Result<FileId>;
/// Load a file by id.
- fn load_file(&self, id: FileId) -> Option<Vec<u8>>;
+ ///
+ /// This must only be called with an `id` returned by a call to this
+ /// loader's `resolve_from` method.
+ fn load_file(&self, id: FileId) -> io::Result<Vec<u8>>;
}
/// A file id that can be [resolved](Loader::resolve_from) from a path.
@@ -53,11 +57,11 @@ impl Loader for BlankLoader {
&[]
}
- fn resolve_from(&self, _: FileId, _: &Path) -> Option<FileId> {
- None
+ fn resolve_from(&self, _: FileId, _: &Path) -> io::Result<FileId> {
+ Err(io::ErrorKind::NotFound.into())
}
- fn load_file(&self, _: FileId) -> Option<Vec<u8>> {
- None
+ fn load_file(&self, _: FileId) -> io::Result<Vec<u8>> {
+ panic!("resolve_from never returns an id")
}
}