diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-09-20 19:49:47 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-09-20 19:49:47 +0200 |
| commit | 3760748fddd3b793c79c370398a9d4a3fc5afc04 (patch) | |
| tree | b1a615e510aa231cfe9757a9c0a35a375e32e3ba /src/library/graphics | |
| parent | 757a701c1aa2a6fb80033c7e75666661818da6f9 (diff) | |
Refactor error handling
Diffstat (limited to 'src/library/graphics')
| -rw-r--r-- | src/library/graphics/hide.rs | 4 | ||||
| -rw-r--r-- | src/library/graphics/image.rs | 21 | ||||
| -rw-r--r-- | src/library/graphics/line.rs | 4 | ||||
| -rw-r--r-- | src/library/graphics/shape.rs | 4 | ||||
| -rw-r--r-- | src/library/graphics/transform.rs | 8 |
5 files changed, 22 insertions, 19 deletions
diff --git a/src/library/graphics/hide.rs b/src/library/graphics/hide.rs index f2a423ce..505dd1f6 100644 --- a/src/library/graphics/hide.rs +++ b/src/library/graphics/hide.rs @@ -6,7 +6,7 @@ pub struct HideNode(pub LayoutNode); #[node] impl HideNode { - fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> { + fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> { Ok(Content::inline(Self(args.expect("body")?))) } } @@ -17,7 +17,7 @@ impl Layout for HideNode { world: &dyn World, regions: &Regions, styles: StyleChain, - ) -> TypResult<Vec<Frame>> { + ) -> SourceResult<Vec<Frame>> { let mut frames = self.0.layout(world, regions, styles)?; for frame in &mut frames { frame.clear(); diff --git a/src/library/graphics/image.rs b/src/library/graphics/image.rs index 1642c7b0..c0249b3c 100644 --- a/src/library/graphics/image.rs +++ b/src/library/graphics/image.rs @@ -1,6 +1,6 @@ use std::ffi::OsStr; -use crate::image::Image; +use crate::image::{Image, ImageFormat, RasterFormat, VectorFormat}; use crate::library::prelude::*; use crate::library::text::TextNode; @@ -13,19 +13,22 @@ impl ImageNode { /// How the image should adjust itself to a given area. pub const FIT: ImageFit = ImageFit::Cover; - fn construct(vm: &mut Vm, args: &mut Args) -> TypResult<Content> { + fn construct(vm: &mut Vm, args: &mut Args) -> SourceResult<Content> { let Spanned { v: path, span } = args.expect::<Spanned<EcoString>>("path to image file")?; let full = vm.locate(&path).at(span)?; + let buffer = vm.world.file(&full).at(span)?; let ext = full.extension().and_then(OsStr::to_str).unwrap_or_default(); - let image = vm - .world - .file(&full) - .and_then(|buffer| Image::new(buffer, ext)) - .map_err(|err| failed_to_load("image", &full, err)) - .at(span)?; + let format = match ext.to_lowercase().as_str() { + "png" => ImageFormat::Raster(RasterFormat::Png), + "jpg" | "jpeg" => ImageFormat::Raster(RasterFormat::Jpg), + "gif" => ImageFormat::Raster(RasterFormat::Gif), + "svg" | "svgz" => ImageFormat::Vector(VectorFormat::Svg), + _ => bail!(span, "unknown image format"), + }; + let image = Image::new(buffer, format).at(span)?; let width = args.named("width")?; let height = args.named("height")?; @@ -41,7 +44,7 @@ impl Layout for ImageNode { _: &dyn World, regions: &Regions, styles: StyleChain, - ) -> TypResult<Vec<Frame>> { + ) -> SourceResult<Vec<Frame>> { let pxw = self.0.width() as f64; let pxh = self.0.height() as f64; let px_ratio = pxw / pxh; diff --git a/src/library/graphics/line.rs b/src/library/graphics/line.rs index 95c3a709..ebfec1b2 100644 --- a/src/library/graphics/line.rs +++ b/src/library/graphics/line.rs @@ -15,7 +15,7 @@ impl LineNode { #[property(resolve, fold)] pub const STROKE: RawStroke = RawStroke::default(); - fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> { + fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> { let origin = args.named("origin")?.unwrap_or_default(); let delta = match args.named::<Spec<Relative<RawLength>>>("to")? { @@ -43,7 +43,7 @@ impl Layout for LineNode { _: &dyn World, regions: &Regions, styles: StyleChain, - ) -> TypResult<Vec<Frame>> { + ) -> SourceResult<Vec<Frame>> { let stroke = styles.get(Self::STROKE).unwrap_or_default(); let origin = self diff --git a/src/library/graphics/shape.rs b/src/library/graphics/shape.rs index ee5e43e8..d9162557 100644 --- a/src/library/graphics/shape.rs +++ b/src/library/graphics/shape.rs @@ -39,7 +39,7 @@ impl<const S: ShapeKind> ShapeNode<S> { pub const RADIUS: Corners<Option<Relative<RawLength>>> = Corners::splat(Relative::zero()); - fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> { + fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> { let size = match S { SQUARE => args.named::<RawLength>("size")?.map(Relative::from), CIRCLE => args.named::<RawLength>("radius")?.map(|r| 2.0 * Relative::from(r)), @@ -81,7 +81,7 @@ impl<const S: ShapeKind> Layout for ShapeNode<S> { world: &dyn World, regions: &Regions, styles: StyleChain, - ) -> TypResult<Vec<Frame>> { + ) -> SourceResult<Vec<Frame>> { let mut frames; if let Some(child) = &self.0 { let mut inset = styles.get(Self::INSET); diff --git a/src/library/graphics/transform.rs b/src/library/graphics/transform.rs index 0a4f5b5f..34d45bd0 100644 --- a/src/library/graphics/transform.rs +++ b/src/library/graphics/transform.rs @@ -12,7 +12,7 @@ pub struct MoveNode { #[node] impl MoveNode { - fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> { + fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> { let dx = args.named("dx")?.unwrap_or_default(); let dy = args.named("dy")?.unwrap_or_default(); Ok(Content::inline(Self { @@ -28,7 +28,7 @@ impl Layout for MoveNode { world: &dyn World, regions: &Regions, styles: StyleChain, - ) -> TypResult<Vec<Frame>> { + ) -> SourceResult<Vec<Frame>> { let mut frames = self.child.layout(world, regions, styles)?; let delta = self.delta.resolve(styles); @@ -62,7 +62,7 @@ impl<const T: TransformKind> TransformNode<T> { #[property(resolve)] pub const ORIGIN: Spec<Option<RawAlign>> = Spec::default(); - fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> { + fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> { let transform = match T { ROTATE => { let angle = args.named_or_find("angle")?.unwrap_or_default(); @@ -89,7 +89,7 @@ impl<const T: TransformKind> Layout for TransformNode<T> { world: &dyn World, regions: &Regions, styles: StyleChain, - ) -> TypResult<Vec<Frame>> { + ) -> SourceResult<Vec<Frame>> { let origin = styles.get(Self::ORIGIN).unwrap_or(Align::CENTER_HORIZON); let mut frames = self.child.layout(world, regions, styles)?; |
