Skip to content

Commit f7606b9

Browse files
committed
refactor: host
1 parent 75d8697 commit f7606b9

File tree

9 files changed

+173
-120
lines changed

9 files changed

+173
-120
lines changed

src/channel.rs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ use crate::{
77
compiler::Compiler,
88
connection::{ConnectedGuard, Connection},
99
dispatcher::Dispatcher,
10-
importer_registry::ImporterRegistry,
11-
logger_registry::LoggerRegistry,
10+
host::Host,
1211
};
1312

1413
#[derive(Debug)]
@@ -25,23 +24,13 @@ impl Channel {
2524
Self { path, dispatcher }
2625
}
2726

28-
pub fn connect(
29-
&mut self,
30-
logger_registry: Option<LoggerRegistry>,
31-
importer_registry: Option<ImporterRegistry>,
32-
) -> ConnectedGuard {
27+
pub fn connect(&mut self, host: Host) -> ConnectedGuard {
3328
let conn = Connection::new(Arc::clone(&self.dispatcher));
34-
match self
35-
.dispatcher
36-
.subscribe(conn, logger_registry, importer_registry)
37-
{
38-
Err((conn, logger_registry, importer_registry)) => {
29+
match self.dispatcher.subscribe(conn, host) {
30+
Err((conn, host)) => {
3931
let compiler = Compiler::new(&self.path);
4032
self.dispatcher = Dispatcher::new(compiler);
41-
self
42-
.dispatcher
43-
.subscribe(conn, logger_registry, importer_registry)
44-
.unwrap()
33+
self.dispatcher.subscribe(conn, host).unwrap()
4534
}
4635
Ok(conn) => conn,
4736
}

src/connection.rs

Lines changed: 20 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use crossbeam_channel::{Receiver, Sender};
44

55
use crate::{
66
dispatcher::Dispatcher,
7-
importer_registry::ImporterRegistry,
8-
logger_registry::LoggerRegistry,
7+
host::Host,
98
protocol::{
109
inbound_message::{self, CompileRequest, VersionRequest},
1110
outbound_message::{
@@ -28,6 +27,7 @@ pub struct Connected {
2827
id: u32,
2928
tx: Sender<Response>,
3029
rx: Receiver<Response>,
30+
host: Host,
3131
}
3232

3333
#[derive(Debug)]
@@ -36,8 +36,6 @@ pub struct Unconnected;
3636
pub struct Connection<S: Debug> {
3737
state: S,
3838
dispatcher: Arc<Dispatcher>,
39-
logger_registry: Option<LoggerRegistry>,
40-
importer_registry: Option<ImporterRegistry>,
4139
}
4240

4341
impl<S: Debug> Debug for Connection<S> {
@@ -67,23 +65,14 @@ impl Connection<Unconnected> {
6765
Self {
6866
state: Unconnected,
6967
dispatcher,
70-
logger_registry: None,
71-
importer_registry: None,
7268
}
7369
}
7470

75-
pub fn connect(
76-
self,
77-
id: u32,
78-
logger_registry: Option<LoggerRegistry>,
79-
importer_registry: Option<ImporterRegistry>,
80-
) -> ConnectedGuard {
71+
pub fn connect(self, id: u32, host: Host) -> ConnectedGuard {
8172
let (tx, rx) = crossbeam_channel::bounded(1);
8273
ConnectedGuard(Arc::new(Connection {
83-
state: Connected { id, tx, rx },
74+
state: Connected { id, tx, rx, host },
8475
dispatcher: self.dispatcher,
85-
logger_registry,
86-
importer_registry,
8776
}))
8877
}
8978
}
@@ -110,39 +99,31 @@ impl Connection<Connected> {
11099
}
111100

112101
pub fn log_event(&self, e: LogEvent) {
113-
if let Some(logger_registry) = &self.logger_registry {
114-
logger_registry.log(e)
115-
}
102+
self.state.host.log(e);
116103
}
117104

118105
pub fn canonicalize_request(&self, e: CanonicalizeRequest) {
119-
if let Some(importer_registry) = &self.importer_registry {
120-
self.send_message(InboundMessage {
121-
message: Some(inbound_message::Message::CanonicalizeResponse(
122-
importer_registry.canonicalize(&e),
123-
)),
124-
});
125-
}
106+
self.send_message(InboundMessage {
107+
message: Some(inbound_message::Message::CanonicalizeResponse(
108+
self.state.host.canonicalize(&e),
109+
)),
110+
});
126111
}
127112

128113
pub fn import_request(&self, e: ImportRequest) {
129-
if let Some(importer_registry) = &self.importer_registry {
130-
self.send_message(InboundMessage {
131-
message: Some(inbound_message::Message::ImportResponse(
132-
importer_registry.import(&e),
133-
)),
134-
});
135-
}
114+
self.send_message(InboundMessage {
115+
message: Some(inbound_message::Message::ImportResponse(
116+
self.state.host.import(&e),
117+
)),
118+
});
136119
}
137120

138121
pub fn file_import_request(&self, e: FileImportRequest) {
139-
if let Some(importer_registry) = &self.importer_registry {
140-
self.send_message(InboundMessage {
141-
message: Some(inbound_message::Message::FileImportResponse(
142-
importer_registry.file_import(&e),
143-
)),
144-
});
145-
}
122+
self.send_message(InboundMessage {
123+
message: Some(inbound_message::Message::FileImportResponse(
124+
self.state.host.file_import(&e),
125+
)),
126+
});
146127
}
147128

148129
pub fn compile_request(

src/dispatcher.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ use std::sync::Arc;
55
use crate::{
66
compiler::Compiler,
77
connection::{Connected, ConnectedGuard, Connection, Unconnected},
8-
importer_registry::ImporterRegistry,
9-
logger_registry::LoggerRegistry,
8+
host::{Host},
109
protocol::{outbound_message, InboundMessage, OutboundMessage},
1110
};
1211

@@ -39,21 +38,13 @@ impl Dispatcher {
3938
pub fn subscribe(
4039
&self,
4140
observer: Connection<Unconnected>,
42-
logger_registry: Option<LoggerRegistry>,
43-
importer_registry: Option<ImporterRegistry>,
44-
) -> Result<
45-
ConnectedGuard,
46-
(
47-
Connection<Unconnected>,
48-
Option<LoggerRegistry>,
49-
Option<ImporterRegistry>,
50-
),
51-
> {
41+
host: Host,
42+
) -> Result<ConnectedGuard, (Connection<Unconnected>, Host)> {
5243
let mut id = self.id.lock();
5344
if *id == Self::PROTOCOL_ERROR_ID {
54-
return Err((observer, logger_registry, importer_registry));
45+
return Err((observer, host));
5546
}
56-
let observer = observer.connect(*id, logger_registry, importer_registry);
47+
let observer = observer.connect(*id, host);
5748
self.observers.insert(*id, Arc::clone(&observer.0));
5849
*id += 1;
5950
Ok(observer)

src/embedded.rs

Lines changed: 68 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ use std::ffi::OsStr;
22

33
use crate::{
44
channel::Channel,
5-
importer_registry::ImporterRegistry,
6-
logger_registry::LoggerRegistry,
5+
host::ImporterRegistry,
6+
host::{Host, LoggerRegistry},
77
protocol::{
8-
inbound_message::{compile_request::Input, CompileRequest},
8+
inbound_message::{
9+
compile_request::{Input, StringInput},
10+
CompileRequest,
11+
},
912
outbound_message::{
1013
compile_response::{self, CompileSuccess},
1114
CompileResponse,
1215
},
1316
},
14-
Exception, Options, Result,
17+
Exception, Options, Result, StringOptions,
1518
};
1619

1720
#[derive(Debug)]
@@ -29,13 +32,17 @@ impl Embedded {
2932
pub fn compile(
3033
&mut self,
3134
path: impl Into<String>,
32-
mut options: Options,
35+
options: Options,
3336
) -> Result<CompileResult> {
34-
let logger_registry = LoggerRegistry::new(options.logger.take());
35-
let importer_registry = ImporterRegistry::new(
36-
options.importers.take(),
37-
options.load_paths.take(),
38-
);
37+
let mut logger_registry = LoggerRegistry::default();
38+
let mut importer_registry = ImporterRegistry::default();
39+
let importers = importer_registry
40+
.register_all(
41+
options.importers.unwrap_or_default(),
42+
options.load_paths.unwrap_or_default(),
43+
)
44+
.collect();
45+
options.logger.map(|l| logger_registry.register(l));
3946

4047
let request = CompileRequest {
4148
style: options.style as i32,
@@ -46,20 +53,66 @@ impl Embedded {
4653
quiet_deps: options.quiet_deps,
4754
source_map_include_sources: options.source_map_include_sources,
4855
charset: options.charset,
49-
importers: importer_registry.importers(),
56+
importers,
5057
input: Some(Input::Path(path.into())),
58+
// id: set in compile_request
59+
// global_functions: not implemented
60+
..Default::default()
61+
};
62+
63+
let host = Host::new(importer_registry, logger_registry);
64+
let conn = self.channel.connect(host);
65+
let response = conn.compile_request(request)?;
66+
Ok(CompileResult::try_from(response)?)
67+
}
68+
69+
pub fn compile_string(
70+
&mut self,
71+
source: impl Into<String>,
72+
options: StringOptions,
73+
) -> Result<CompileResult> {
74+
let mut logger_registry = LoggerRegistry::default();
75+
let mut importer_registry = ImporterRegistry::default();
76+
let importers = importer_registry
77+
.register_all(
78+
options.common.importers.unwrap_or_default(),
79+
options.common.load_paths.unwrap_or_default(),
80+
)
81+
.collect();
82+
options.common.logger.map(|l| logger_registry.register(l));
83+
84+
let request = CompileRequest {
85+
style: options.common.style as i32,
86+
source_map: options.common.source_map,
87+
alert_color: options.common.alert_color,
88+
alert_ascii: options.common.alert_ascii,
89+
verbose: options.common.verbose,
90+
quiet_deps: options.common.quiet_deps,
91+
source_map_include_sources: options.common.source_map_include_sources,
92+
charset: options.common.charset,
93+
importers,
94+
input: Some(Input::String(StringInput {
95+
source: source.into(),
96+
url: options.url.map(|url| url.to_string()).unwrap_or_default(),
97+
syntax: options.syntax as i32,
98+
importer: options.importer.map(|i| importer_registry.register(i)),
99+
})),
100+
// id: set in compile_request
101+
// global_functions: not implemented
51102
..Default::default()
52103
};
53104

54-
let conn = self
55-
.channel
56-
.connect(Some(logger_registry), Some(importer_registry));
105+
let host = Host::new(importer_registry, logger_registry);
106+
let conn = self.channel.connect(host);
57107
let response = conn.compile_request(request)?;
58108
Ok(CompileResult::try_from(response)?)
59109
}
60110

61111
pub fn info(&mut self) -> Result<String> {
62-
let conn = self.channel.connect(None, None);
112+
let logger_registry = LoggerRegistry::default();
113+
let importer_registry = ImporterRegistry::default();
114+
let host = Host::new(importer_registry, logger_registry);
115+
let conn = self.channel.connect(host);
63116
let response = conn.version_request()?;
64117
Ok(format!(
65118
"sass-embedded\t#{}",

src/host.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
mod importer_registry;
2+
mod logger_registry;
3+
4+
pub use importer_registry::ImporterRegistry;
5+
pub use logger_registry::LoggerRegistry;
6+
7+
use crate::protocol::{
8+
inbound_message::{CanonicalizeResponse, FileImportResponse, ImportResponse},
9+
outbound_message::{
10+
CanonicalizeRequest, FileImportRequest, ImportRequest, LogEvent,
11+
},
12+
};
13+
14+
#[derive(Debug, Default)]
15+
pub struct Host {
16+
importer: ImporterRegistry,
17+
logger: LoggerRegistry,
18+
}
19+
20+
impl Host {
21+
pub fn new(importer: ImporterRegistry, logger: LoggerRegistry) -> Self {
22+
Self { importer, logger }
23+
}
24+
25+
pub fn canonicalize(
26+
&self,
27+
request: &CanonicalizeRequest,
28+
) -> CanonicalizeResponse {
29+
self.importer.canonicalize(request)
30+
}
31+
32+
pub fn import(&self, request: &ImportRequest) -> ImportResponse {
33+
self.importer.import(request)
34+
}
35+
36+
pub fn file_import(&self, request: &FileImportRequest) -> FileImportResponse {
37+
self.importer.file_import(request)
38+
}
39+
40+
pub fn log(&self, event: LogEvent) {
41+
self.logger.log(event);
42+
}
43+
}

0 commit comments

Comments
 (0)