| Crates.io | qcl |
| lib.rs | qcl |
| version | 0.1.3 |
| created_at | 2024-09-11 06:10:10.978277+00 |
| updated_at | 2025-07-15 05:50:19.55929+00 |
| description | A Query Check Language written in Rust |
| homepage | |
| repository | https://github.com/lollipopkit/qcl |
| max_upload_size | |
| id | 1371618 |
| size | 132,576 |
It's designed to be used in ACL (Access Control List) systems, where you need to check if a user has access to a resource.
(@record.published || @record.owner == @req.user.id) // Normal case
|| // Or operator
(@req.user.role == 'admin' || @req.user.id in @record.granted) // Special case
Let's break it down:
@req.user.role == 'admin': Check if the user has the role of admin.@req.user.id in @record.granted: Check if the user's id is in the granted list of the record.@record.published: Check if the record is published.@record.owner == @req.user.id: Check if the record's owner is the user.The above example is a simple ACL system that checks if the user has access to a record.
More language details can be found in LANG.md.
// Parse expr
let expr = "@req.user.name in 'foobar' && @files.0.published == true";
let expr = Expr::try_from(expr)?;
// Construct context
let ctx_names = expr.requested_ctx(); // ["req", "files"]
// You can construct the context indeed, but we use json! for simplicity
let ctx = json!({
"req": {
"user": "foo"
},
"files": [
{
"name": "file1",
"published": true
}
]
});
// Eval
let result = expr.eval(ctx.into())?; // Val::Bool(true)
match result {
Val::Bool(b) => {
assert!(b);
}
_ => {
panic!("unexpected result");
}
}
Apache-2.0 lollipopkit