sass_embedded/
legacy.rs

1//! Support for "legacy" features.
2
3mod api;
4mod importer;
5
6use std::{sync::Arc, time::SystemTime};
7
8pub use api::*;
9pub use importer::*;
10
11use crate::{
12  Embedded, Exception, Importer, Options, Result, SassImporter, StringOptions,
13};
14
15impl Embedded {
16  /// More information: [Sass documentation](https://sass-lang.com/documentation/js-api/modules#renderSync)
17  pub fn render(&mut self, options: LegacyOptions) -> Result<LegacyResult> {
18    let start = SystemTime::now();
19    let entry = options
20      .file
21      .clone()
22      .map(|file| file.to_str().unwrap().to_string())
23      .unwrap_or_else(|| "stdin".to_string());
24    let mut options = options.adjust_options();
25    let result = if let Some(data) = options.data.clone() {
26      let this = LegacyPluginThis::new(&options);
27      let (importers, input_importer) =
28        if let Some(importers) = options.importers.take() {
29          let wrapper = LegacyImporterWrapper::new(
30            this,
31            importers,
32            options.include_paths.clone(),
33            &entry,
34          );
35          let importers = vec![SassImporter::Importer(Box::new(Arc::clone(
36            &wrapper,
37          ))
38            as Box<dyn Importer>)];
39          let input_importer = Some(SassImporter::Importer(
40            Box::new(wrapper) as Box<dyn Importer>
41          ));
42          (importers, input_importer)
43        } else {
44          (Vec::new(), None)
45        };
46      let mut options = StringOptions::from(options);
47      options.common.importers = importers;
48      options.input_importer = input_importer;
49      self.compile_string(data, options)
50    } else if let Some(file) = options.file.clone() {
51      let this = LegacyPluginThis::new(&options);
52      let importers = options
53        .importers
54        .take()
55        .map(|importers| {
56          let wrapper = LegacyImporterWrapper::new(
57            this,
58            importers,
59            options.include_paths.clone(),
60            &entry,
61          );
62          let importers = vec![SassImporter::Importer(Box::new(Arc::clone(
63            &wrapper,
64          ))
65            as Box<dyn Importer>)];
66          importers
67        })
68        .unwrap_or_default();
69      let mut options = Options::from(options);
70      options.importers = importers;
71      self.compile(file, options)
72    } else {
73      Err(
74        Exception::new("Either options.data or options.file must be set.")
75          .into(),
76      )
77    }?;
78    Ok(LegacyResult::new(
79      if entry == "stdin" {
80        "data".to_string()
81      } else {
82        entry
83      },
84      start,
85      result,
86    ))
87  }
88}