From 40ea35cbe7482ce04096c4d63a848c8601cc1848 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 3 Feb 2020 10:37:50 +0100 Subject: =?UTF-8?q?Upgrade=20to=20new=20toddle=20interface=20=F0=9F=90=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 13 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index a36b5cda..07a60e35 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,8 +21,14 @@ pub use toddle; use std::cell::RefCell; +use std::error::Error; +use std::fmt::{self, Debug, Formatter}; +use std::io::Cursor; +use async_trait::async_trait; use smallvec::smallvec; -use toddle::query::{FontLoader, FontProvider, SharedFontLoader}; + +use toddle::{Font, OwnedData}; +use toddle::query::{FontLoader, FontProvider, SharedFontLoader, FontDescriptor}; use crate::layout::{Layouted, MultiLayout}; use crate::style::{LayoutStyle, PageStyle, TextStyle}; @@ -45,20 +51,29 @@ pub mod syntax; /// Transforms source code into typesetted layouts. /// /// A typesetter can be configured through various methods. -pub struct Typesetter<'p> { +pub struct Typesetter { /// The font loader shared by all typesetting processes. - loader: SharedFontLoader<'p>, + loader: GlobalFontLoader, /// The base layouting style. style: LayoutStyle, /// The standard library scope. scope: Scope, } -impl<'p> Typesetter<'p> { +/// The font loader type used in the [`Typesetter`]. +/// +/// This font loader is ref-cell protected and backed by a dynamic font +/// provider. +pub type GlobalFontLoader = SharedFontLoader; + +/// The provider type of font loaders used in the [`Typesetter`]. +pub type GlobalProvider = Box>>; + +impl Typesetter { /// Create a new typesetter. - pub fn new() -> Typesetter<'p> { + pub fn new(provider: (GlobalProvider, Vec)) -> Typesetter { Typesetter { - loader: RefCell::new(FontLoader::new()), + loader: RefCell::new(FontLoader::new(provider)), style: LayoutStyle::default(), scope: Scope::with_std(), } @@ -74,14 +89,8 @@ impl<'p> Typesetter<'p> { self.style.text = style; } - /// Add a font provider to the context of this typesetter. - pub fn add_font_provider(&mut self, provider: P) - where P: FontProvider { - self.loader.get_mut().add_provider(provider); - } - /// A reference to the backing font loader. - pub fn loader(&self) -> &SharedFontLoader<'p> { + pub fn loader(&self) -> &GlobalFontLoader { &self.loader } @@ -121,3 +130,29 @@ impl<'p> Typesetter<'p> { self.layout(&tree).await.output } } + +/// Wraps a font provider and transforms its errors into boxed trait objects. +/// This enables font providers that do not return boxed errors to be used with +/// the typesetter. +pub struct DynErrorProvider

{ + provider: P, +} + +impl

DynErrorProvider

+where P: FontProvider, P::Error: Error + 'static { + /// Create a new dynamic error provider from any provider. + pub fn new(provider: P) -> DynErrorProvider

{ + DynErrorProvider { provider } + } +} + +#[async_trait(?Send)] +impl

FontProvider for DynErrorProvider

+where P: FontProvider, P::Error: Error + 'static { + type Data = P::Data; + type Error = Box; + + async fn load(&self, index: usize, variant: usize) -> Result, Self::Error> { + Ok(self.provider.load(index, variant).await?) + } +} -- cgit v1.2.3