css_parse/
cursor_to_source_cursor_sink.rs1use crate::{Cursor, CursorSink, SourceCursor, SourceCursorSink};
2use std::fmt::Write;
3
4pub struct CursorToSourceCursorSink<'a, T: SourceCursorSink<'a>> {
5 source: &'a str,
6 sink: T,
7}
8
9impl<'a, T: SourceCursorSink<'a>> CursorToSourceCursorSink<'a, T> {
10 pub fn new(source: &'a str, sink: T) -> Self {
11 Self { source, sink }
12 }
13}
14
15impl<'a, T: SourceCursorSink<'a>> CursorSink for CursorToSourceCursorSink<'a, T> {
16 fn append(&mut self, cursor: Cursor) {
17 self.sink.append(SourceCursor::from(cursor, cursor.str_slice(self.source)))
18 }
19}
20
21impl<'a> SourceCursorSink<'a> for String {
22 fn append(&mut self, c: SourceCursor<'a>) {
23 let _ = write!(self, "{c}");
24 }
25}
26
27impl<'a, T: SourceCursorSink<'a>> SourceCursorSink<'a> for &mut T {
28 fn append(&mut self, c: SourceCursor<'a>) {
29 (**self).append(c)
30 }
31}
32
33#[cfg(test)]
34mod test {
35 use super::*;
36 use crate::{ComponentValues, EmptyAtomSet, Parser, ToCursors};
37 use bumpalo::Bump;
38 use css_lexer::Lexer;
39
40 #[test]
41 fn test_source_cursor_sink_for_string() {
42 let source_text = "black white";
43 let bump = Bump::default();
44 let mut str = String::new();
45 let mut transform = CursorToSourceCursorSink::new(source_text, &mut str);
46 let lexer = Lexer::new(&EmptyAtomSet::ATOMS, source_text);
47 let mut parser = Parser::new(&bump, source_text, lexer);
48 parser.parse_entirely::<ComponentValues>().output.unwrap().to_cursors(&mut transform);
49 assert_eq!(str, "black white");
50 }
51}