connorskees / grass Goto Github PK
View Code? Open in Web Editor NEWA Sass compiler written purely in Rust
Home Page: https://docs.rs/grass/
License: MIT License
A Sass compiler written purely in Rust
Home Page: https://docs.rs/grass/
License: MIT License
width: calc(100% + 32px);
becomes
width:calc(100%+32px);
which is invalid.
Hello,
Today as I was looking for a way to compile Sass in my project, I was annoyed to not being able to use any npm module with Deno because of some breaking changes, so I decided to use Grass and compile it into wasm to use the WebAssembly module, turns out after many tries it worked,
I had to do some edit to the lib.rs file in order to compile it without error, but I am sure it's not breaking changes.
I just learned Rust only today, so my code might be just garbage! But if it can help, I just wanted to share this.
Here's a link to the Deno module https://github.com/hironichu/denosass (The updated Grass rust source code is not in there yet)
Edit : This module also runs in browsers, should work in nodejs as well but have not tried.
The fix in e2c32a6 fixes an issue I was having with paths. Could you publish a new release with this to crates.io? Thanks much!
Minimal Reproducible Example:
Consider the three files, main.scss
(the root module), utils.scss
(which provides some utility variables/mixins), and other.scss
(which also uses the utilities):
// main.scss
@use "utils";
@use "other";
.from-main { color: utils.$value; }
// utils.scss
$value: #fff;
// other.scss
@use "utils";
.from-other { color: utils.$value; }
grass
Output:
Error: There's already a module with namespace "utils".
╷
1 │ @use "utils";
│ ^^^^^^
╵
./other:1:7
dart-sass
Output:
.from-other {
color: #fff;
}
.from-main {
color: #fff;
}
From what I can tell, in dart-sass
, each module has its own scope for @use
imports, but grass
does not. As a user, the dart-sass
implementation is what I would expect.
I saw the npm version is 0.10.0 published two years ago. Can you publish the latest version for npm?
Currently, the map type is implemented as a vector of key-value pairs, which means that insertion, lookup, and removal are all O(n). In addition, construction of map literals is O(n^2).
I was initially planning to implement a better structure for the SassMap ad hoc, but it seems like this structure would be a good fit instead.
This issue is a reminder as I do not intend on touching this for a while. The performance of maps is not incredibly important for right now.
As title, I need use grass in my custom project, there are some complicated path calculation need to do, such as custom alias rules. But found that 'grass::from_string_with_file_name' can not be used.
Hi @connorskees,
I'm a core member of the frontend framework Seed. I'm looking for a SASS library that I can integrate into Seed projects and yours looks like a good fit.
Could you answer these questions please:
Thank you very much!
P.S. You are very welcome to join our chat and forum (links on the Seed website), we can help at least with testing your library with WASM framework.
Hey, once again I am very pleased with how far this project has come! Keep up the good work.
I wanted to suggest an API improvement to grass::from_path
. There are definitely a few ways to do this, however in a use case of mine, I am dealing with a potentially cross-platform FS path. So, either a &Path
or an AsRef<Path>
might be a nice improvement here. Currently, the parameter just needs to be a &str
. Which is obviously doable, but I think in many cases, the suggestion I'm making here will be an ergonomics improvement.
I should have time to pop a quick PR for this later today, but I at least wanted to open this up for some discussion.
For my usecase, I'm applying some additional preprocessing to the scss source. This works well with the from_string way of loading a file, but it does not allow me to apply the same preprocessing to files that are imported in that main scss file.
My proposed solution would be to add a trait, let's call it ImportLoader
or whatever, which specifies a single function that takes a filepath and returns the file content as a String.
This could then be used to both apply arbitrary logic to the paths, thus allowing for more intricate file resolution in different usecases, as well as apply transformations to the file contents itself, as would be my usecase.
If this is something you would consider adding, or if you can think of any other, more fitting solution for my problem, I'd be more than happy to work on a PR for this!
Having a non-sendable error type prevents composing it with type-erasing error carriers like anyhow
:
error[E0277]: `Rc<std::io::Error>` cannot be sent between threads safely
|
| grass::from_path(&path, &options)?;
| ^ `Rc<std::io::Error>` cannot be sent between threads safely
|
= help: within `grass::Error`, the trait `Send` is not implemented for `Rc<std::io::Error>`
= note: required because it appears within the type `grass::error::SassErrorKind`
= note: required because it appears within the type `grass::Error`
= note: required because it appears within the type `Box<grass::Error>`
= note: required because of the requirements on the impl of `From<Box<grass::Error>>` for `anyhow::Error`
I really like your grass project, I have previously used this library for some of my command line tools that deal with scss, with good results. In my recent project, I have some dependent code that uses @import "theme.scss"
or @import "theme"
to import scss files under load_paths
.
However, when I try to use grass, I find that the former always fails to import.
I browsed through the source code and found that find_import
function handles paths with scss
, sass
, css
file extensions differently than paths without extensions, and that the former one does not attempt to use load_paths in the current version and has been marked as a TODO.
// todo: consider load paths
Are there any plans to add this feature in the near future?
Hi, when I run cargo doc
on a crate that depends on grass
0.12.4 with stable Rust 1.70.0, I get the error:
error[E0554]: `#![feature]` may not be used on the stable release channel
--> xxx/grass_compiler-0.12.4/src/lib.rs:35:18
|
35 | #![cfg_attr(doc, feature(doc_cfg))]
| ^^^^^^^^^^^^^^^^
For more information about this error, try `rustc --explain E0554`.
error: could not document `grass_compiler`
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.0.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.1.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.10.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.11.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.12.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.13.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.14.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.15.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.2.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.3.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.4.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.5.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.6.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.7.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.8.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.9.rcgu.o" "-o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.so" "-Wl,--version-script=/tmp/rustcovBs9X/list" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass.406x5fboagaw4c7q.rcgu.o" "-Wl,--gc-sections" "-Wl,-zrelro" "-Wl,-znow" "-Wl,-O1" "-nodefaultlibs" "-L" "/home/ivan/src/pickfire/rs/grass/target/release/deps" "-L" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libindexmap-272dfa54f275ebe9.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_rational-5b6727a0ab3f057e.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_bigint-0a8d817cd5b163f5.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_integer-6dee54ff6b762013.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/librand-388ff9cd82d0b82e.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/librand_chacha-f1c4bdbeb3400ecb.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libppv_lite86-ba722eb1c54d002c.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/librand_core-981207432e62a9e0.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libgetrandom-31e953732b193a03.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/liblibc-e2f92431c381dfcb.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libcfg_if-356719a0c851b556.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_traits-f16b11c1f8204c53.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libonce_cell-060e4a6cff902dc3.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libpeekmore-67158b3baacd8e71.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libsmallvec-7a2f48b407fdbffb.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libcodemap-9d2998489f91ef56.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libbeef-40489afbdced911f.rlib" "-Wl,--start-group" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-6640d3868fa846e8.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-48481e446108229f.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-bfdf9e1c331f914a.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-991e68a3d0300af6.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace-74304cfed66bbabf.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-5db30a83f5489d12.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-a106c3f62654e72c.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-3d6b30695af38106.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-d8f11f6bb46ba3ee.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-60c81ab95e289dd1.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd1a416f10d6c43d.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-4a2bd2b60cccd1fb.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-7ea8ebc630055039.rlib" "-Wl,--end-group" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-f7cd12d3ecd59a89.rlib" "-Wl,-Bdynamic" "-lutil" "-ldl" "-lutil" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-ldl" "-lutil" "-shared"
= note: cc: error: /home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.2.rcgu.o: No such file or directory
cc: error: /home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.3.rcgu.o: No such file or directory
cc: error: /home/ivan/src/pickfire/rs/grass/target/release/deps/grass.grass.5ed2u8vo-cgu.6.rcgu.o: No such file or directory
cc: error: /home/ivan/src/pickfire/rs/grass/target/release/deps/grass.406x5fboagaw4c7q.rcgu.o: No such file or directory
error: aborting due to previous error
Compiling grass v0.9.4 (/home/ivan/src/pickfire/rs/grass)
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.0.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.1.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.10.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.11.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.12.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.13.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.14.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.15.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.2.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.3.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.4.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.5.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.6.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.7.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.8.rcgu.o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.9.rcgu.o" "-o" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486" "/home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.2sykgkkzrk6pgmzl.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-Wl,-O1" "-nodefaultlibs" "-L" "/home/ivan/src/pickfire/rs/grass/target/release/deps" "-L" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libindexmap-40467740c29225af.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_rational-03f497498ff16dcf.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_bigint-91157aeb9b06104c.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_integer-6b65c12876849f73.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/librand-467ef675655a9201.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/librand_chacha-6ef1eb1ad79ef190.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libppv_lite86-9e86f41034dc3f8b.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/librand_core-ba93445cdf1e16b3.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libgetrandom-041cad6fc2685895.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libcfg_if-a59addd8999591a4.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libnum_traits-a448d22377fe3565.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libonce_cell-f2cbbf08aa09e553.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libpeekmore-707579d356fa23b4.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libsmallvec-4bac12e736f5739b.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libcodemap-6006131a3d97dec9.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libbeef-4e2456202d8850a6.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libclap-250ff29ac3050d1e.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libvec_map-e82667bf8f5da3b3.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libtextwrap-45813dc7a73b5c5e.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libunicode_width-0d87ff4517d83cc0.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libstrsim-b6b6062010211374.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libbitflags-1d6f3e2181b943c9.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libatty-c750b1f80fcff442.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/liblibc-a507ad065fe2d647.rlib" "/home/ivan/src/pickfire/rs/grass/target/release/deps/libansi_term-fb20393a4da1250f.rlib" "-Wl,--start-group" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-6640d3868fa846e8.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_abort-bef409d4599e726e.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-bfdf9e1c331f914a.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-991e68a3d0300af6.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace-74304cfed66bbabf.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-5db30a83f5489d12.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-a106c3f62654e72c.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-3d6b30695af38106.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-d8f11f6bb46ba3ee.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-60c81ab95e289dd1.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-fd1a416f10d6c43d.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-4a2bd2b60cccd1fb.rlib" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-7ea8ebc630055039.rlib" "-Wl,--end-group" "/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-f7cd12d3ecd59a89.rlib" "-Wl,-Bdynamic" "-lutil" "-ldl" "-lutil" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-ldl" "-lutil"
= note: /usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486.grass.dlr4bzj0-cgu.4.rcgu.o: in function `grass::from_path':
/home/ivan/src/pickfire/rs/grass/src/lib.rs:140: undefined reference to `grass::parse::Parser::parse'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o):/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: more undefined references to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807' follow
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::IntoIter<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::IntoIter<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::IntoIter<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `grass::output::Css::parse_stmt':
/home/ivan/src/pickfire/rs/grass/src/output.rs:173: undefined reference to `<grass::parse::Stmt as core::fmt::Debug>::fmt'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/src/output.rs:172: undefined reference to `<grass::parse::Stmt as core::fmt::Debug>::fmt'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/src/output.rs:146: undefined reference to `<grass::parse::Stmt as core::fmt::Debug>::fmt'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17h90c78c13a22af883E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::IntoIter<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17h90c78c13a22af883E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::IntoIter<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::IntoIter<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h0fd809c3d2f3df42E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::IntoIter<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2711: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17h90c78c13a22af883E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17hd0896d94ce9d007fE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.12.rcgu.o): in function `<alloc::vec::Vec<T> as core::ops::drop::Drop>::drop':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:2382: undefined reference to `_ZN4core3ptr13drop_in_place17h2e62cb081e94e68eE.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `std::io::error::Error::new':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/io/error.rs:251: undefined reference to `anon.15b965a4fba59a3c05b1859a91574dda.1.llvm.12514866935107365344'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::result::Result<T,E>::unwrap_or_else':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/result.rs:853: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in28_$u7b$$u7b$closure$u7d$$u7d$17h44f14550fe4b9c38E.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `alloc::raw_vec::RawVec<T,A>::try_reserve':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/raw_vec.rs:357: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$4grow17h78183caa615a7e27E.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::iter::traits::iterator::Iterator::try_fold':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/iter/traits/iterator.rs:1881: undefined reference to `_ZN4core3ptr13drop_in_place17h42a6a7620ecb945cE.llvm.3807353400474003484'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::result::Result<T,E>::unwrap_or_else':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/result.rs:853: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in28_$u7b$$u7b$closure$u7d$$u7d$17h546adda3e4df47ffE.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::ops::function::FnMut::call_mut':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ops/function.rs:154: undefined reference to `_ZN78_$LT$grass..selector..simple..SimpleSelector$u20$as$u20$core..clone..Clone$GT$5clone17h3fa67f8f87a8bde3E.llvm.3807353400474003484'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::result::Result<T,E>::unwrap_or_else':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/result.rs:853: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in28_$u7b$$u7b$closure$u7d$$u7d$17hdcfa35f3d883f66dE.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::iter::traits::iterator::Iterator::try_fold':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/iter/traits/iterator.rs:1881: undefined reference to `_ZN4core3ptr13drop_in_place17hd8ea7ba883a1f3bbE.llvm.3807353400474003484'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::result::Result<T,E>::unwrap_or_else':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/result.rs:853: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in28_$u7b$$u7b$closure$u7d$$u7d$17h0e44400ab20d8beeE.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `alloc::raw_vec::RawVec<T,A>::try_reserve':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/raw_vec.rs:357: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$4grow17h4cd8d116e53ec2edE.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::result::Result<T,E>::unwrap_or_else':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/result.rs:853: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in28_$u7b$$u7b$closure$u7d$$u7d$17h95dbc9be583059c2E.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::iter::traits::iterator::Iterator::try_fold':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/iter/traits/iterator.rs:1881: undefined reference to `_ZN4core3ptr13drop_in_place17h5b1f8c372836b422E.llvm.3807353400474003484'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `alloc::raw_vec::RawVec<T,A>::try_reserve':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/raw_vec.rs:357: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$4grow17h78183caa615a7e27E.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.3.rcgu.o): in function `core::result::Result<T,E>::unwrap_or_else':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/result.rs:853: undefined reference to `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in28_$u7b$$u7b$closure$u7d$$u7d$17h8393c57a98a17d2fE.llvm.7415830645013885171'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:1981: undefined reference to `<alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:1981: undefined reference to `<alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:1981: undefined reference to `<alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:1981: undefined reference to `<alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:1981: undefined reference to `<alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.5.rcgu.o): in function `<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/liballoc/vec.rs:1981: undefined reference to `<alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.0.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.0.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/libgrass.rlib(grass.grass.5ed2u8vo-cgu.0.rcgu.o): in function `core::ptr::drop_in_place':
/home/ivan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/ptr/mod.rs:177: undefined reference to `_ZN4core3ptr13drop_in_place17ha63dbd2a90b9f086E.llvm.18168459070913568807'
/usr/bin/ld: /home/ivan/src/pickfire/rs/grass/target/release/deps/grass-224607d083cb5486: hidden symbol `_ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$11allocate_in28_$u7b$$u7b$closure$u7d$$u7d$17hdcfa35f3d883f66dE.llvm.7415830645013885171' isn't defined
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
error: aborting due to previous error
error: could not compile `grass`.
To learn more, run the command again with --verbose.
Minimal Reproducible Example (from Bootstrap 4.1.1):
@mixin mixin2($color) {
background-color: $color;
}
@mixin mixin1($color) {
color: $color;
@include mixin2(lighten($color, 10%));
color: $color;
}
body {
@include mixin1(#29a846);
}
grass 0.10.2
Output:
body {
color: #29a846;
background-color: #36ce59;
color: #36ce59;
}
dart-sass
Output:
body {
color: #29a846;
background-color: #36ce59;
color: #29a846;
}
Minimal Reproducible Example:
.box {
box-shadow: 0 0.5em gray;
}
grass
Output:
(with style set to compressed
)
.box{box-shadow: .5em gray}
dart-sass
Output:
(with style set to compressed
)
.box{box-shadow:0 .5em gray}
the output does match dart-sass when they both have style set to expanded
Minimal Reproducible Example:
// common.scss
$color: #fff;
// sub.scss
@use "common";
body
{
font-color: common.$color;
}
// super.scss
@use "common";
@use "sub";
div
{
font-color: common.$color;
}
grass
Output:
Error: There's already a module with namespace "common".
╷
1 │ @use "common";
│ ^^^^^^^
╵
./sub:1:7
dart-sass
Output:
body {
font-color: #fff;
}
div {
font-color: #fff;
}
/*# sourceMappingURL=super.css.map */
I have been getting component governance alerts for Grass due to its nested dependency on atty, which has been unmaintained for a few years now and has some compatibility issues with Windows. Your nested dependency on atty comes from clap, though they've moved away from atty as of last year (see clap-rs/clap#4249).
Here's a link to the advisory in the GitHub Security Advisory Database: GHSA-g98v-hv3f-hcfr
https://github.com/maciejhirsz/beef is faster than Cow
in standard library.
Hi!
I would like to be able to specify fake module "load path", which just uses in-memory &str
. My use case is generating syntax highlighting CSS via syntect and then embedding it into an SCSS file, but it could also be useful for providing "standard library"-like features when embedding SCSS compiler.
Most of the template engines doesn't support css/sass files. Would be great if there was include_sass_str!("./style.sass")
and include_sass_bytes!("./sytle.sass")
so that we can easily embed the compiled version of the file without creating a build.rs
file.
Looking to something similar to this https://crates.io/crates/include-flate.
Currently, i'm trying to use cargo make with watch to keep recompiling the scss with grass. But after the first time it fails with:
Error: Os { code: 9, kind: Other, message: "Bad file descriptor" }
The problem seems to be this line:
Line 194 in fdf8e61
https://doc.rust-lang.org/std/fs/struct.File.html#method.open
File::open()
opens the file in read only mode.
This api is kinda frustrating and the lifetimes are unnecessary, it should something akin to
pub fn load_paths<P: AsRef<Path>>(mut self, paths: &[P]) -> Self {…}
pub fn load_path<P: AsRef<Path>>(mut self, path: P) -> Self {…}
This is more akin to how APIs typically work in the rust std. The overhead is probably insignificant, and makes the Options
API significantly easier to use, and lets your end-users pass in anything thats convertible to e.g. a Path
(via reference) or a PathBuf
(as an owned value).
Personally, regarding the Options
struct over here, it'd be simpler to just store owned values (and so use PathBuf
), e.g. instead of:
#[derive(Debug)]
pub struct Options<'a> {
load_paths: Vec<&'a Path>,
…
}
It should be
#[derive(Debug)]
pub struct Options<'a> {
load_paths: Vec<PathBuf>,
…
}
And just copy the values pass in VIA
pub fn load_paths<P: AsRef<Path>>(mut self, paths: &[P]) -> Self {…}
pub fn load_path<P: AsRef<Path>>(mut self, path: P) -> Self {…}
But, if you really wanna use Path
objects and avoid copying, I'd use Cow<Path>
pointers internally and then give the user the option of passing in owned values or references VIA e.g. P: AsRef<Path>
or P: Into<PathBuf>
(for passing in owned values specifically or just P: AsRef<Path>
and clone it).
I've come across an issue with the library when trying to import paths that were non relative to the scss
root file.
This illustrates the issue:
test-grass/
├─ src/
│ ├─ main.rs
├─ scss/
│ ├─ root.scss
├─ my/
│ ├─ susy/
│ │ ├─ susy.scss
This is the code that leads to the behavior:
tempfile!("scss/root.scss", "@import \"susy\";\na {\n color: $a;\n}");
tempfile!("my/susy/susy.scss", "$a: red;");
// not relative dir
assert_eq!(
"a {\n color: red;\n}\n",
grass::from_path(
"scss/root.scss",
&grass::Options::default().load_path(std::path::Path::new("my/susy"))
).expect("susy")
);
So when trying to execute the former I run into:
Error: Can't find stylesheet to import.
╷
1 │ @import "susy";
│ ^
╵
./scss/root.scss:1:9
', src/main.rs:31:19
Is this expected behavior?
I want to give a try to reduce size of Color
. Currently,
error: size: Size { raw: 216 }
--> src/color/mod.rs:32:1
|
32 | / pub(crate) struct Color {
33 | | rgba: Rgba,
34 | | hsla: Option<Hsla>,
35 | | repr: String,
36 | | }
| |_^
error: size: Size { raw: 96 }
--> src/color/mod.rs:79:1
|
79 | / struct Rgba {
80 | | red: Number,
81 | | green: Number,
82 | | blue: Number,
83 | | alpha: Number,
84 | | }
| |_^
error: size: Size { raw: 32 }
--> src/color/mod.rs:88:1
|
88 | / struct Rgba2 {
89 | | red: f64,
90 | | green: f64,
91 | | blue: f64,
92 | | alpha: f64,
93 | | }
| |_^
error: size: Size { raw: 24 }
--> src/value/number/mod.rs:21:1
|
21 | / pub(crate) enum Number {
22 | | Small(Rational64),
23 | | Big(Box<BigRational>),
24 | | }
| |_^
Currently,
pub(crate) struct Color {
rgba: Rgba,
hsla: Option<Hsla>,
repr: String,
}
struct Rgba {
red: Number,
green: Number,
blue: Number,
alpha: Number,
}
struct Hsla {
hue: Number,
saturation: Number,
luminance: Number,
alpha: Number,
}
It looks quite huge. I wonder if the following is possible.
pub(crate) struct Color {
rgb: Rgb,
// Do we really need an Option since usually I see either one of Rgba or Hsla can be specified?
// Or can both be specified at the same time?
// Or maybe just convert Hsla to Rgba and store only Rgba? Not sure if this works.
hsl: Option<Hsl>,
// I think we could probably follow libsass and use double precision here.
alpha: f64,
// I suggest using SmartString later on for this to allow small string optimization (23 bits could be stored in stack IIRC)
// I wonder if it would be beneficial if this can be lazily calculated without keeping it in memory?
repr: SmartString,
}
struct Rgb {
// Since we are converting these to u8 later on, do we really need it to be Ratio or we can use u8?
// Or is it used for those translate functions, I am not sure.
// If u8 is not possible, I guess f64 would be a better choice.
red: u8,
green: u8,
blue: u8,
}
// Have yet checked much on this yet, I bet u8 is not possible here.
struct Hsl {
hue: f64,
saturation: f64,
luminance: f64,
}
This could probably get us to 64 bytes from 216. Or if we split out Hsla from a pointer (Box), we could probably get 32 bytes. I personally think it could be beneficial for cache lines to speed things up, not sure how true is this but we saw performance improvements last time for size reduction IIRC.
@connorskees What do you think?
In my project (https://github.com/elkowar/eww), I already have a error reporting infrastructure and error rendering system which defines how errors for non-scss stuff looks. It'd be very nice if I could integrate grass errors into that code.
For this, the SassErrorKind
field of SassError
and the Type itself would need to be public. That way, I could access the Location and Span information of the error myself, and decide how to render the errors, rather than being restricted to the built-in rendering solution from grass.
The below SCSS code should compile, verbatim, to CSS, but fails to compile with "auto is not a number"
.
div {
width: min(200px, auto);
}
Expected: no change to file, because it is already valid and correct CSS.
Minimal example:
fn main() {
let scss = r#" div { width: min(100px, auto); } "#;
let css = grass::from_string(scss, &grass::Options::default());
println!("{:#?}", css);
assert!(css.is_ok(), "Failed to compile");
}
Same result is found using 100%
or 100vw
instead of 100px
, or switching argument order.
I would assume that min
is a SCSS function (as well as CSS), expecting literal or variable arguments, not auto
keyword. The error can be bypassed by not including brackets in the function call, eg. width: min 100px, auto;
.
I assume this is unintended behaviour, as I could not find an explaination online or in the documentation.
Hey!
I'm considering using grass
for a project and would like to get access to some information that grass does not currently expose.
I saw in the README:
It offers a very limited API, currently exposing only 2 functions.
So if what I'm asking for goes against the project's goals that's totally fine and I can just fork.
I write my HTML in Rust and would like to prevent typos when dealing with CSS. For example:
// BAD: I don't want to do this
let _ = html! { <div class="cool-class"></div> };
// GOOD: I want to do this
let _ = html! { <div class=MyClassEnum::CoolClass></div>
In order to do this, my build script needs to be able to know every class that is defined in the sass so that it can generate the enum.
It looks like grass has a Stmt
type which contains all of the information that I would need.
i.e. SimpleSelector::Id
SimpleSelector::Class
etc.
One way to enable this would be to expose a new function:
pub fn stmts_from_path (path: &str, options: &Options) -> Result<Vec<Stmt>> {
todo!()
}
This would mean that I would have to not only run the parser once to get my CSS String, but also another time to get my statements.
I've suggested one potential path forwards, but I'm pretty open to anything that allows me to do what I want to do.
I'm also happy to just find a new approach (i.e. fork, regex, something else) to get the information that I want if supporting this use case doesn't fit into grass' vision.
So, to me it just comes down to
EDIT: Exposing statements would also be generally useful for other tooling. For example, a linter that enforces a naming schema.
This serves as a tracking issue for everything that needs to be implemented in order to support @use
in a feature-complete manner. This intentionally ignores @forward
for the time being, though if it appears easy to implement then it will be included here at a later point.
The initial implementation is tracked in #28. With the current patch as is, grass
is now passing 3,375 tests.
sass:color
sass:list
sass:map
sass:math
clamp
hypot
log
pow
sqrt
cos
sin
tan
acos
asin
atan
atan2
pi
e
sass:meta
load-css
module-functions
module-variables
module
parameter
get-function
global-variable-exists
mixin-exists
sass:selector
sass:string
@include
of module mixins@use ... as ...;
@use ... as *;
@use ... with (...);
(including load-css
)Itertools provide MultiPeek
, a peekable iterator but I don't think they have cursors or the sort. The good thing is that it provides a lot of good stuff like peeking_take_while
. The downside is I don't see an alternative for truncate_iterator_to_cursor
.
I try to replace node-sass in a project, but found only the ES module is supported, will you consider supporting this?
Hey, nice project. When trying to compile for WASM with cargo build --features wasm-exports --release
, I get these errors. Couldn't find it reported anywhere but sorry if already known.
Compiling grass v0.11.0 (/home/goose/grass)
error[E0061]: this function takes 2 arguments but 1 argument was supplied
--> src/lib.rs:368:5
|
368 | from_string(Options::default()).map_err(|e| e.to_string())
| ^^^^^^^^^^^ ------------------ supplied 1 argument
| |
| expected 2 arguments
|
note: function defined here
--> src/lib.rs:361:8
|
361 | pub fn from_string(input: String, options: &Options) -> Result<String> {
| ^^^^^^^^^^^ ------------- -----------------
error[E0308]: mismatched types
--> src/lib.rs:368:5
|
367 | pub fn from_string_js(p: String) -> std::result::Result<String, JsValue> {
| ------------------------------------ expected `Result<String, wasm_bindgen::JsValue>` because of return type
368 | from_string(Options::default()).map_err(|e| e.to_string())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `wasm_bindgen::JsValue`, found struct `String`
|
= note: expected enum `Result<_, wasm_bindgen::JsValue>`
found enum `Result<_, String>`
A 1.0 release of grass
should be able to compile bootstrap identically to dart-sass
. The features currently blocking Bootstrap from even compiling are
@extend
@keyframes
@supports
red
, green
, and blue
)and
operatoror
operator@import
The places where grass
and dart-sass
differ in output are
["foo"] => [foo]
, but we retain quotes). dart-sass
has complex rules for determining whether quotes should be emitted or notRc<RefCell<Selector>>
@media
@media
/
should only occur in special casesupd: I see that it's a common sass misfeature sass/sass#2770
so unlikely to expect grass to deviate
I'm using grass via zola SSG and I've noticed that comments in --var
are not stripped from the output, thus breaking my ability to add comments with explanations for colors
// file.sass
:root.light
--var: oklch(.87 0 90) // comment not removed in the output
I see that CSS variables should include everything, notably comments https://github.com/connorskees/grass/pull/67
on #19, which is maybe related and implies this is intentional, but I don't understand the reason behind that, the comments like these aren't meant to be included
Although that example has foo: //;
a semicolon, while the one I'm using is the cleaner sass version, so maybe this explains it?
(although some online dart sass tools strip the comments properly fro this format)
I have this simplified example which fails:
$global-color: var(--global-var);
$icon-link-active-color: darken($global-color, 5%);
It fails with Error: $global-color: var(--global-var) is not a color.
While this indeed isn't it should know that css vars are or can be colors :)
(For a working example take a look at #26 (comment) )
I notice that the readme mentions "css imports" still remaining. So this might just be a case that hasn't been implemented yet. However, I took a quick look at the imports test cases, and nothing jumped to my eye, so I thought I'd report it anyways.
The @import url("...")
is not moved to the top after other @import "..."
s have been resolved. The contents of the other imports thereby appear before the @import url("...")
in the final output. Which the docs for @import
on MDN mentions is not allowed.
Imported rules must precede all other types of rules, except
@charset
rules; as it is not a nested statement,@import
cannot be used inside conditional group at-rules.
My specific case, was that I had an @import url
which imported a font. Which resulted in the font never being loaded, given that it was not at the top of the style sheet.
Minimal Reproducible Example:
// style.scss
@import "foo";
@import url("...");
// foo.scss
span {
color: red;
}
grass
Output:
span {
color: red;
}
@import url("...");
dart-sass
Output:
@import url("...");
span {
color: red;
}
Hi,
I'm using grass as part of Zola and it seems it can't compile sass that includes PicoCSS.
It looks like the map.deep-merge() function isn't implemented? It's marked 'since 1.27.0' so presume should be in the targeted dart-sass version?
Including Pico 2.0-alpha1 gives this error:
Error: Error: Undefined function.
40 │ $breakpoints: map.deep-merge(
│ ^^^^^^^^^^^^^
Hi there,
I saw there are a number of outstanding tests that aren't passing. As someone outside to the project, I would love to adopt the library and contribute, but I am wondering what the failing areas are, and what kind of work would be entailed to tackle the remaining parts of the test suite. Maybe the project can have some issues open for major areas of work to be done?
Thanks,
Phil
We could add self profiling to grass to find out which part of compilation takes the most time. measureme from rust (also used by boa) would be an interesting option.
grass
is very close to completion and is approaching a 1.0 release. The API is stable and there are very few deviations from the reference implementation.
That said, there is still a bit of work to be done before I would want to call grass
fully feature-complete and having full parity with the reference implementation. In its current state I would argue that grass
is suitable for virtually all users of Sass, though there are still a few pieces missing.
This is a rough outline of my thoughts for what to work on next for this project. A large part of the remaining work is to catch up with the new features dart-sass
has added in the last year or so.
@use
and @forward
have a really surprising level of depth and complexity. Right now very few Sass projects use the module system, but as people move away from libsass
, I expect that number to increase. There are a large number of failing spec tests related to this and I'm aware of at least 1 project that fails to compile due to its mixing of @import
, @use
, and @forward
. This bullet is just to solve all of the remaining failing spec tests
grass
hasn't had a breaking change to its rust API in well over 2 years, and the API that exists currently is resilient to breaking changes. I consider this section largely feature complete, and unless new features are requested, grass
will retain the same API it has currently in a 1.0
version.
I may want to add the ability to further configure grass::include!
output options, but it should be possible to do so in a backwards-compatible way.
Features that rely on the internals of grass
, such as Sass functions written in rust or AST traversal can be built through the internals crate grass_compiler
.
We differ from dart-sass
in a number of ways that don't affect the semantics of the output, but do affect the byte-for-byte equality of the output. For the purposes of automated diffing, it would be nice to resolve these differences. Additionally, there are some places where I think grass
can improve on things like error messages and error spans.
a { /**/ }
should emit a { /**/ }
. This is a feature dart-sass
has added in the last few monthsa > > b {}
should not be emitted. This is again a very recent addition to dart-sass
@import
rules above loud comments that were declared above them--foo: ...
)dart-sass
, though does not affect semanticsNaN
, we do not print NaN
's unit@media
indentation bug that we had been emulating, so we should update our code as wellbulma
in CIbootstrap
in CIdart-sass
differential fuzzing. grass
is already quite regularly fuzzed for crashes, but differential fuzzing would let us find other kinds of bugsI've implemented benchmarking in connorskees/sass-perf. grass
is ~2x faster than dart-sass
for all but 1 benchmark. I have a branch currently that improves SassMaps to make them proper hash maps with amortized constant time lookup and insertion. This doesn't fully fix performance issues on this benchmark, but does bring us a little bit closer. The remaining work here is
Rc
/Arc
Rc
/Arc
An exploration into using Arc/Rc for all values improved performance on bootstrap by about 20-50%.
These are real issues that can affect the semantics of the outputted CSS or cause errors/crashes on valid input. In general, these are extremely rare issues that do not come up very often in practice, but they should be resolved before a final release
@extend
and selector changes have been made in dart-sass
that we need to emulate
inspect(..)
dart-sass
. Rust's stdlib float formatter is insufficient for our needsrandom
featurecommandline
in default features. Unfortunately seems blocked on rust-lang/cargo#10409 in order to not make this a breaking changeThis section is intended to grow as dart-sass
adds new features. As part of maintaining grass, new features and bug fixes must be periodically translated from dart-sass
.
dart-sass
)calc
-like functions sass/dart-sass#1970Dear Grass Team,
I hope this message finds you well. I wanted to bring to your attention an issue I encountered while using the Grass library to compile the Fontsource mixins.scss file. The issue pertains to the map.get function and its behavior when attempting to retrieve a nested value from a map.
Description:
When using the map.get function in Grass, I noticed that it works perfectly fine when retrieving a value from a top-level map. However, when trying to retrieve a value from a nested map using the same function, an error is thrown stating that only two arguments are allowed instead of three.
I encountered this issue specifically when compiling the Fontsource mixins.scss file, which relies on the map.get function to retrieve nested values from the metadata map.
For example, consider the following code snippet from mixins.scss:
...
$display: if($display, $display, swap);
$formats: if(not $formats or $formats == all, if($isVariable, woff2, (woff2, woff)), $formats);
$subsets: if(
$subsets,
if($subsets == all, map.get($metadata, subsets), $subsets),
map.get($metadata, defaults, subset)
);
$weights: if(
$weights,
if($weights == all, map.get($metadata, weights), $weights),
map.get($metadata, defaults, weight)
);
$styles: if(
$styles,
if($styles == all, map.get($metadata, styles), $styles),
map.get($metadata, defaults, style)
);
$axes: if(
$axes,
if($axes == all, full, $axes),
if($isVariable, if(map.has-key($metadata, axes, wght), wght, full), null)
);
...
In this case, the map.get function fails when attempting to retrieve the nested values from the $metadata map within the if statements.
Error Message:
Error: Only 2 arguments allowed, but 3 were passed.
╷
48 │ map.get($metadata, defaults, subset)
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╵
./mixins.scss:48:5
Test to Replicate the Issue:
To replicate the issue, I have created a simple test case using Grass and Sass that demonstrates the problem with the map.get function. Here's the code snippet:
//nestedmap.scss
@use 'sass:map';
$colors: (
primary: (
text: #FF0000,
bg: #990000,
),
secondary: (
text: #00FF00,
bg: #009900,
),
);
.text-primary {
color: map.get($colors, primary);
}
.bg-primary {
background-color: map.get($colors, primary, bg); // Error occurs here
}
.text-secondary {
color: map.get($colors, secondary);
}
.bg-secondary {
background-color: map.get($colors, secondary, bg); // Error occurs here
}
grass nestedmap.scss nestedmap.css
Error: Only 2 arguments allowed, but 3 were passed.
╷
19 │ background-color: map.get($colors, primary, bg); // Error occurs here
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╵
./nestedmap.scss:19:21
When attempting to compile the above Sass code using the Grass compiler, the same error occurs, indicating that only two arguments are allowed instead of three when using the map.get function to retrieve nested values.
Expected Behavior:
Ideally, the map.get function in Grass should support retrieving nested values from a map without any errors.
I hope this information helps in addressing the issue. If you need any further details or assistance, please let me know. Thank you for your attention to this matter, and I appreciate your efforts in maintaining the Grass library.
Best regards
For more context refer to https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity
Documentation
)I'm working on some tooling to do dependency analysis of my company's sass files.
In a nutshell I want to parse a sass file, extract the "imports" (eg @use
, @include
, etc) and build a dependency graph across our rather large codebase.
I was looking into the grass_compiler
internals (correct me if I'm wrong) but it looks like most of the infra required to parse and traverse a sass file is pub(crate)
- making it unusable externally.
I saw #77 mentions
AST traversal can be built through the internals crate grass_compiler.
Does this mean that you want to support this sort of usecase for 1.0?
This implementation is at a point where it makes sense to
This issue serves as a way to keep track of all known compilation issues
@use
and the module system (MVP)@forward
#67These ideally come with minimal reproductions, though the reason why they're failing may be incorrect as they haven't been fully looked into
@import "hey1.css", "cookie.css", url("hey2.css"), "fudge.css";
@media (color) {a {color: red;}}
min(1, min(2))
min(1, env(--foo))
@media (#{"100px < width < 500px"}) {a {interpolation: in-parens}}
simple-selectors(">")
@supports
, @keyframes
)
@-webkit-keyframes {}
color: red;
should errorNaN
(0 / 0)
Infinity
(this has been updated to return an error instead of crashing) #67
(1 / 0)
1 / 2
should be emitted as 1/2
, but it currently gives 0.5
--foo: //;
.9999999999999999999999999999999 == .99999999999999999999999999999998
@import
should be moved to the top of the file/
#67
rgba(1, 2, 3 / 4)
url(...)
#67
url((((()))))
(this should actually produce an error, but it just emits url()
@import
should include strings verbatim #67
@import "hux\ bux.css";
this should include the \
, but it does not because we use normal string parsing10-#{10}
should give 10 -10
but it gives 10-10
(1px / 1em)
!optional
in @extend
@mixin
without @content
#67@extend
should not be possible between media query boundaries@media
query merging #67inspect(...)
does not properly preserve parens in some cases@charset
should only accept a string
@charset 1+1;
should errorcolor: qu#{o}te(red)
current returns "red"
, but should give quote(red)
@foo "bar";
(we do parse this correctly, but we emit it with two semicolons)U+A2??
keywords
#67@supports
#67deg
to builtin fns, math.cos(1grad)
#67for distribution packaging of the binary
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.