Skip to content

Commit a2dcafe

Browse files
committed
feat: poor version sync compile
1 parent ff810d9 commit a2dcafe

File tree

4 files changed

+104
-24
lines changed

4 files changed

+104
-24
lines changed

Cargo.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ prost = "0.10"
88
url = "2"
99
async-trait = "0.1"
1010
futures = "0.3"
11-
tokio = { version = "1", features = ["io-util", "process", "macros"] }
11+
tokio = { version = "1", features = [
12+
"io-util",
13+
"process",
14+
"macros",
15+
"rt",
16+
"rt-multi-thread",
17+
] }
1218
tokio-stream = "0.1"
1319
tokio-util = { version = "0.7", features = ["io"] }
1420
supports-color = "1"

src/api.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ pub struct Options {
3636
pub style: OutputStyle,
3737
/// https://sass-lang.com/documentation/js-api/interfaces/Options#verbose
3838
pub verbose: Option<bool>,
39+
40+
// TODO: find a better way??
41+
pub exe_path: Option<String>,
3942
}
4043

4144
/// https://sass-lang.com/documentation/js-api/modules#StringOptions
@@ -74,14 +77,17 @@ pub enum SassImporter {
7477
#[async_trait]
7578
pub trait Importer: Debug {
7679
/// https://sass-lang.com/documentation/js-api/interfaces/Importer#canonicalize
77-
async fn canonicalize(
80+
async fn canonicalize<'u, 'o>(
7881
&self,
79-
url: &str,
80-
options: &ImporterOptions,
82+
url: &'u str,
83+
options: &'o ImporterOptions,
8184
) -> Result<Option<Url>>;
8285

8386
/// https://sass-lang.com/documentation/js-api/interfaces/Importer#load
84-
async fn load(&self, canonical_url: &Url) -> Result<Option<ImporterResult>>;
87+
async fn load<'u>(
88+
&self,
89+
canonical_url: &'u Url,
90+
) -> Result<Option<ImporterResult>>;
8591
}
8692

8793
pub struct ImporterOptions {
@@ -92,10 +98,10 @@ pub struct ImporterOptions {
9298
#[async_trait]
9399
pub trait FileImporter: Debug {
94100
/// https://sass-lang.com/documentation/js-api/interfaces/FileImporter#findFileUrl
95-
async fn find_file_url(
101+
async fn find_file_url<'u, 'o>(
96102
&self,
97-
url: &str,
98-
options: &ImporterOptions,
103+
url: &'u str,
104+
options: &'o ImporterOptions,
99105
) -> Result<Option<Url>>;
100106
}
101107

src/compile.rs

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,81 @@ use crate::{
44
compiler_path,
55
importer_registry::ImporterRegistry,
66
logger_registry::LoggerRegistry,
7-
pb::{inbound_message::CompileRequest, outbound_message::compile_response},
7+
pb::{
8+
inbound_message::CompileRequest,
9+
outbound_message::{compile_response, CompileResponse},
10+
},
811
Error,
912
};
1013

14+
pub fn compile_sync(
15+
path: String,
16+
mut options: Options,
17+
) -> Result<CompileResult> {
18+
let exe = exe_path(&options);
19+
let mut importers =
20+
ImporterRegistry::new(options.importers.take(), options.load_paths.take());
21+
let logger = LoggerRegistry::new(options.logger.take());
22+
23+
let request = CompileRequest::with_path(path, &mut importers, &options);
24+
let rt = tokio::runtime::Runtime::new().unwrap();
25+
let response = rt.block_on(async {
26+
let embedded = Embedded::new(exe);
27+
let res = embedded.compile(request, &importers, &logger).await?;
28+
Ok::<CompileResponse, Error>(res)
29+
})?;
30+
31+
handle_response(response)
32+
}
33+
34+
pub fn compile_string_sync(
35+
source: String,
36+
mut options: Options,
37+
string_options: StringOptions,
38+
) -> Result<CompileResult> {
39+
let exe = exe_path(&options);
40+
let mut importers =
41+
ImporterRegistry::new(options.importers.take(), options.load_paths.take());
42+
let logger = LoggerRegistry::new(options.logger.take());
43+
44+
let request = CompileRequest::with_string(
45+
source,
46+
&mut importers,
47+
&options,
48+
string_options,
49+
);
50+
let rt = tokio::runtime::Runtime::new().unwrap();
51+
let response = rt.block_on(async {
52+
let embedded = Embedded::new(exe);
53+
let res = embedded.compile(request, &importers, &logger).await?;
54+
Ok::<CompileResponse, Error>(res)
55+
})?;
56+
57+
handle_response(response)
58+
}
59+
1160
pub async fn compile(
1261
path: String,
1362
mut options: Options,
1463
) -> Result<CompileResult> {
64+
let exe = exe_path(&options);
1565
let mut importers =
1666
ImporterRegistry::new(options.importers.take(), options.load_paths.take());
1767
let logger = LoggerRegistry::new(options.logger.take());
1868

1969
let request = CompileRequest::with_path(path, &mut importers, &options);
20-
let embedded = Embedded::new(compiler_path::compiler_path().unwrap());
70+
let embedded = Embedded::new(exe);
2171
let response = embedded.compile(request, &importers, &logger).await?;
2272

23-
let res = response.result.ok_or_else(|| {
24-
Error::Compile(
25-
"OutboundMessage.CompileResponse.result is not set".to_string(),
26-
)
27-
})?;
28-
match res {
29-
compile_response::Result::Success(success) => Ok(success.into()),
30-
compile_response::Result::Failure(failure) => {
31-
Err(Exception::new(failure).into())
32-
}
33-
}
73+
handle_response(response)
3474
}
3575

3676
pub async fn compile_string(
3777
source: String,
3878
mut options: Options,
3979
string_options: StringOptions,
4080
) -> Result<CompileResult> {
81+
let exe = exe_path(&options);
4182
let mut importers =
4283
ImporterRegistry::new(options.importers.take(), options.load_paths.take());
4384
let logger = LoggerRegistry::new(options.logger.take());
@@ -48,9 +89,21 @@ pub async fn compile_string(
4889
&options,
4990
string_options,
5091
);
51-
let embedded = Embedded::new(compiler_path::compiler_path().unwrap());
92+
let embedded = Embedded::new(exe);
5293
let response = embedded.compile(request, &importers, &logger).await?;
5394

95+
handle_response(response)
96+
}
97+
98+
fn exe_path(options: &Options) -> String {
99+
options
100+
.exe_path
101+
.as_ref()
102+
.unwrap_or(&compiler_path::compiler_path().unwrap())
103+
.to_string()
104+
}
105+
106+
fn handle_response(response: CompileResponse) -> Result<CompileResult> {
54107
let res = response.result.ok_or_else(|| {
55108
Error::Compile(
56109
"OutboundMessage.CompileResponse.result is not set".to_string(),
@@ -79,6 +132,17 @@ mod tests {
79132
)
80133
.await
81134
.unwrap();
82-
dbg!(res);
135+
assert_eq!(res.css, ".foo {\n a: b;\n}");
136+
}
137+
138+
#[test]
139+
fn test_compile_string_sync() {
140+
let res = compile_string_sync(
141+
".foo {a: b}".to_string(),
142+
Options::default(),
143+
StringOptions::WithoutImporter(WithoutImporter::default()),
144+
)
145+
.unwrap();
146+
assert_eq!(res.css, ".foo {\n a: b;\n}");
83147
}
84148
}

src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ mod pb;
1111
mod request_tracker;
1212

1313
use api::Logger;
14-
pub use api::Options;
14+
pub use api::{
15+
FileImporter, Importer, ImporterOptions, ImporterResult, Options,
16+
SassImporter, SassLogger, StringOptions, WithImporter, WithoutImporter,
17+
};
1518
pub use compile::{compile, compile_string};
19+
pub use compile::{compile_string_sync, compile_sync};
1620
pub use error::{Error, Result};
1721

1822
#[derive(Debug, Default, Clone)]

0 commit comments

Comments
 (0)