summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-06-24 15:05:59 +0200
committerLaurenz <laurmaedje@gmail.com>2023-06-24 15:05:59 +0200
commitf1025071edfb787309a75d4bb68bec0c2bd906bb (patch)
treeb28d6cf05b8a8f29acbfb44093e3c9bface802b6 /src
parentb96b7b7ee12a5d1c8e8c24c95b58b7ca03cec44b (diff)
Tidy up
Diffstat (limited to 'src')
-rw-r--r--src/diag.rs69
-rw-r--r--src/export/render.rs12
2 files changed, 41 insertions, 40 deletions
diff --git a/src/diag.rs b/src/diag.rs
index 0f669f64..9399058a 100644
--- a/src/diag.rs
+++ b/src/diag.rs
@@ -82,7 +82,8 @@ pub struct SourceError {
pub message: EcoString,
/// The trace of function calls leading to the error.
pub trace: Vec<Spanned<Tracepoint>>,
- /// Additonal hints to the user, indicating how this error could be avoided or worked around.
+ /// Additonal hints to the user, indicating how this error could be avoided
+ /// or worked around.
pub hints: Vec<EcoString>,
}
@@ -104,6 +105,12 @@ impl SourceError {
self
}
+ /// Adds user-facing hints to the error.
+ pub fn with_hints(mut self, hints: impl IntoIterator<Item = EcoString>) -> Self {
+ self.hints.extend(hints);
+ self
+ }
+
/// The range in the source file identified by
/// [`self.span.source()`](Span::source) where the error should be
/// annotated.
@@ -115,12 +122,6 @@ impl SourceError {
ErrorPos::End => full.end..full.end,
}
}
-
- /// Adds a user-facing hint to the error.
- pub fn with_hints(mut self, hints: &mut Vec<EcoString>) -> Self {
- self.hints.append(hints);
- self
- }
}
/// A part of an error's [trace](SourceError::trace).
@@ -203,48 +204,44 @@ where
}
}
-pub type StrWithHintResult<T> = Result<T, StrWithHint>;
+/// A result type with a string error message and hints.
+pub type HintedStrResult<T> = Result<T, HintedString>;
-pub struct StrWithHint {
- message: EcoString,
- hints: Vec<EcoString>,
+/// A string message with hints.
+#[derive(Debug, Clone, Eq, PartialEq, Hash)]
+pub struct HintedString {
+ /// A diagnostic message describing the problem.
+ pub message: EcoString,
+ /// Additonal hints to the user, indicating how this error could be avoided
+ /// or worked around.
+ pub hints: Vec<EcoString>,
}
-impl<T> At<T> for Result<T, StrWithHint> {
+impl<T> At<T> for Result<T, HintedString> {
fn at(self, span: Span) -> SourceResult<T> {
- self.map_err(|mut diags| {
- Box::new(vec![
- SourceError::new(span, diags.message).with_hints(&mut diags.hints)
- ])
+ self.map_err(|diags| {
+ Box::new(vec![SourceError::new(span, diags.message).with_hints(diags.hints)])
})
}
}
-/// Allows adding a user-facing hint in addition to the error.
-pub trait Hint<T, S>
-where
- S: Into<EcoString>,
-{
- fn hint(self, hint: S) -> StrWithHintResult<T>;
+/// Enrich a [`StrResult`] or [`HintedStrResult`] with a hint.
+pub trait Hint<T> {
+ /// Add the hint.
+ fn hint(self, hint: impl Into<EcoString>) -> HintedStrResult<T>;
}
-impl<T, S> Hint<T, S> for StrResult<T>
-where
- S: Into<EcoString>,
-{
- fn hint(self, hint: S) -> StrWithHintResult<T> {
- self.map_err(|message| StrWithHint { message, hints: vec![hint.into()] })
+impl<T> Hint<T> for StrResult<T> {
+ fn hint(self, hint: impl Into<EcoString>) -> HintedStrResult<T> {
+ self.map_err(|message| HintedString { message, hints: vec![hint.into()] })
}
}
-impl<T, S> Hint<T, S> for StrWithHintResult<T>
-where
- S: Into<EcoString>,
-{
- fn hint(self, hint: S) -> StrWithHintResult<T> {
- self.map_err(|mut diags| {
- diags.hints.push(hint.into());
- diags
+impl<T> Hint<T> for HintedStrResult<T> {
+ fn hint(self, hint: impl Into<EcoString>) -> HintedStrResult<T> {
+ self.map_err(|mut error| {
+ error.hints.push(hint.into());
+ error
})
}
}
diff --git a/src/export/render.rs b/src/export/render.rs
index 02c10e61..ef0fc9f2 100644
--- a/src/export/render.rs
+++ b/src/export/render.rs
@@ -488,14 +488,18 @@ fn render_image(
let view_width = size.x.to_f32();
let view_height = size.y.to_f32();
- let aspect = (image.width() as f32) / (image.height() as f32);
- // For better-looking output, resize `image` to its final size before painting it to `canvas`.
- // See https://github.com/typst/typst/issues/1404#issuecomment-1598374652 for the math.
+ // For better-looking output, resize `image` to its final size before
+ // painting it to `canvas`. For the math, see:
+ // https://github.com/typst/typst/issues/1404#issuecomment-1598374652
let theta = f32::atan2(-ts.kx, ts.sx);
- // To avoid division by 0, choose the one of { sin, cos } that is further from 0.
+
+ // To avoid division by 0, choose the one of { sin, cos } that is
+ // further from 0.
let prefer_sin = theta.sin().abs() > std::f32::consts::FRAC_1_SQRT_2;
let scale_x =
f32::abs(if prefer_sin { ts.kx / theta.sin() } else { ts.sx / theta.cos() });
+
+ let aspect = (image.width() as f32) / (image.height() as f32);
let w = (scale_x * view_width.max(aspect * view_height)).ceil() as u32;
let h = ((w as f32) / aspect).ceil() as u32;