summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2025-07-09 11:28:26 +0200
committerGitHub <noreply@github.com>2025-07-09 09:28:26 +0000
commite71674f6b3db0768c3e9d6e0271628377f8c82d8 (patch)
tree8ea00050e3441f19c5da952ec0eadb1fecf2d14e /crates
parente5e1dcd9c01341d2cd3473ac94a70223d5966086 (diff)
Construct library via extension trait instead of default & inherent impl (#6576)
Diffstat (limited to 'crates')
-rw-r--r--crates/typst-cli/src/world.rs2
-rw-r--r--crates/typst-ide/src/tests.rs2
-rw-r--r--crates/typst-library/src/lib.rs36
-rw-r--r--crates/typst-library/src/routines.rs7
-rw-r--r--crates/typst/src/lib.rs19
5 files changed, 48 insertions, 18 deletions
diff --git a/crates/typst-cli/src/world.rs b/crates/typst-cli/src/world.rs
index 95bee235..8ad766b1 100644
--- a/crates/typst-cli/src/world.rs
+++ b/crates/typst-cli/src/world.rs
@@ -12,7 +12,7 @@ use typst::foundations::{Bytes, Datetime, Dict, IntoValue};
use typst::syntax::{FileId, Lines, Source, VirtualPath};
use typst::text::{Font, FontBook};
use typst::utils::LazyHash;
-use typst::{Library, World};
+use typst::{Library, LibraryExt, World};
use typst_kit::fonts::{FontSlot, Fonts};
use typst_kit::package::PackageStorage;
use typst_timing::timed;
diff --git a/crates/typst-ide/src/tests.rs b/crates/typst-ide/src/tests.rs
index b3f368f2..168dfc9f 100644
--- a/crates/typst-ide/src/tests.rs
+++ b/crates/typst-ide/src/tests.rs
@@ -10,7 +10,7 @@ use typst::syntax::package::{PackageSpec, PackageVersion};
use typst::syntax::{FileId, Source, VirtualPath};
use typst::text::{Font, FontBook, TextElem, TextSize};
use typst::utils::{singleton, LazyHash};
-use typst::{Feature, Library, World};
+use typst::{Feature, Library, LibraryExt, World};
use crate::IdeWorld;
diff --git a/crates/typst-library/src/lib.rs b/crates/typst-library/src/lib.rs
index fa797788..3e2ce99e 100644
--- a/crates/typst-library/src/lib.rs
+++ b/crates/typst-library/src/lib.rs
@@ -36,6 +36,7 @@ use typst_utils::{LazyHash, SmallBitSet};
use crate::diag::FileResult;
use crate::foundations::{Array, Binding, Bytes, Datetime, Dict, Module, Scope, Styles};
use crate::layout::{Alignment, Dir};
+use crate::routines::Routines;
use crate::text::{Font, FontBook};
use crate::visualize::Color;
@@ -139,6 +140,11 @@ impl<T: World + ?Sized> WorldExt for T {
}
/// Definition of Typst's standard library.
+///
+/// To create and configure the standard library, use the `LibraryExt` trait
+/// and call
+/// - `Library::default()` for a standard configuration
+/// - `Library::builder().build()` if you want to customize the library
#[derive(Debug, Clone, Hash)]
pub struct Library {
/// The module that contains the definitions that are available everywhere.
@@ -154,30 +160,28 @@ pub struct Library {
pub features: Features,
}
-impl Library {
- /// Create a new builder for a library.
- pub fn builder() -> LibraryBuilder {
- LibraryBuilder::default()
- }
-}
-
-impl Default for Library {
- /// Constructs the standard library with the default configuration.
- fn default() -> Self {
- Self::builder().build()
- }
-}
-
/// Configurable builder for the standard library.
///
-/// This struct is created by [`Library::builder`].
-#[derive(Debug, Clone, Default)]
+/// Constructed via the `LibraryExt` trait.
+#[derive(Debug, Clone)]
pub struct LibraryBuilder {
+ #[expect(unused, reason = "will be used in the future")]
+ routines: &'static Routines,
inputs: Option<Dict>,
features: Features,
}
impl LibraryBuilder {
+ /// Creates a new builder.
+ #[doc(hidden)]
+ pub fn from_routines(routines: &'static Routines) -> Self {
+ Self {
+ routines,
+ inputs: None,
+ features: Features::default(),
+ }
+ }
+
/// Configure the inputs visible through `sys.inputs`.
pub fn with_inputs(mut self, inputs: Dict) -> Self {
self.inputs = Some(inputs);
diff --git a/crates/typst-library/src/routines.rs b/crates/typst-library/src/routines.rs
index 4bf8d60c..6db99ba5 100644
--- a/crates/typst-library/src/routines.rs
+++ b/crates/typst-library/src/routines.rs
@@ -1,3 +1,4 @@
+use std::fmt::{self, Debug, Formatter};
use std::hash::{Hash, Hasher};
use comemo::{Tracked, TrackedMut};
@@ -38,6 +39,12 @@ macro_rules! routines {
impl Hash for Routines {
fn hash<H: Hasher>(&self, _: &mut H) {}
}
+
+ impl Debug for Routines {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ f.pad("Routines(..)")
+ }
+ }
};
}
diff --git a/crates/typst/src/lib.rs b/crates/typst/src/lib.rs
index 0673c325..11d5c9e0 100644
--- a/crates/typst/src/lib.rs
+++ b/crates/typst/src/lib.rs
@@ -323,6 +323,25 @@ mod sealed {
}
}
+/// Provides ways to construct a [`Library`].
+pub trait LibraryExt {
+ /// Creates the default library.
+ fn default() -> Library;
+
+ /// Creates a builder for configuring a library.
+ fn builder() -> LibraryBuilder;
+}
+
+impl LibraryExt for Library {
+ fn default() -> Library {
+ Self::builder().build()
+ }
+
+ fn builder() -> LibraryBuilder {
+ LibraryBuilder::from_routines(&ROUTINES)
+ }
+}
+
/// Defines implementation of various Typst compiler routines as a table of
/// function pointers.
///