summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/typst/src/foundations/dict.rs29
1 files changed, 28 insertions, 1 deletions
diff --git a/crates/typst/src/foundations/dict.rs b/crates/typst/src/foundations/dict.rs
index 06c8f0e4..e77d33ff 100644
--- a/crates/typst/src/foundations/dict.rs
+++ b/crates/typst/src/foundations/dict.rs
@@ -8,7 +8,9 @@ use indexmap::IndexMap;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::diag::{Hint, HintedStrResult, StrResult};
-use crate::foundations::{array, func, repr, scope, ty, Array, Repr, Str, Value};
+use crate::foundations::{
+ array, cast, func, repr, scope, ty, Array, Module, Repr, Str, Value,
+};
use crate::syntax::is_ident;
use crate::util::ArcExt;
@@ -158,6 +160,23 @@ impl Dict {
#[scope]
impl Dict {
+ /// Converts a value into a dictionary.
+ ///
+ /// Note that this function is only intended for conversion of a
+ /// dictionary-like value to a dictionary, not for creation of a dictionary
+ /// from individual pairs. Use the dictionary syntax `(key: value)` instead.
+ ///
+ /// ```example
+ /// #dictionary(sys).at("version")
+ /// ```
+ #[func(constructor)]
+ pub fn construct(
+ /// The value that should be converted to a dictionary.
+ value: ToDict,
+ ) -> Dict {
+ value.0
+ }
+
/// The number of pairs in the dictionary.
#[func(title = "Length")]
pub fn len(&self) -> usize {
@@ -237,6 +256,14 @@ impl Dict {
}
}
+/// A value that can be cast to dictionary.
+pub struct ToDict(Dict);
+
+cast! {
+ ToDict,
+ v: Module => Self(v.scope().iter().map(|(k, v)| (Str::from(k.clone()), v.clone())).collect()),
+}
+
impl Debug for Dict {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_map().entries(self.0.iter()).finish()