summaryrefslogtreecommitdiff
path: root/src/library/basic.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/basic.rs')
-rw-r--r--src/library/basic.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/library/basic.rs b/src/library/basic.rs
new file mode 100644
index 00000000..48925122
--- /dev/null
+++ b/src/library/basic.rs
@@ -0,0 +1,65 @@
+use crate::color::{Color, RgbaColor};
+use crate::pretty::pretty;
+
+use super::*;
+
+/// `type`: The name of a value's type.
+///
+/// # Positional parameters
+/// - Any value.
+///
+/// # Return value
+/// The name of the value's type as a string.
+pub fn type_(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
+ match args.require::<Value>(ctx, "value") {
+ Some(value) => value.type_name().into(),
+ None => Value::Error,
+ }
+}
+
+/// `repr`: The string representation of a value.
+///
+/// # Positional parameters
+/// - Any value.
+///
+/// # Return value
+/// The string representation of the value.
+pub fn repr(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
+ match args.require::<Value>(ctx, "value") {
+ Some(value) => pretty(&value).into(),
+ None => Value::Error,
+ }
+}
+
+/// `rgb`: Create an RGB(A) color.
+///
+/// # Positional parameters
+/// - Red component: of type `float`, between 0.0 and 1.0.
+/// - Green component: of type `float`, between 0.0 and 1.0.
+/// - Blue component: of type `float`, between 0.0 and 1.0.
+/// - Alpha component: optional, of type `float`, between 0.0 and 1.0.
+///
+/// # Return value
+/// The color with the given components.
+pub fn rgb(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
+ let r = args.require(ctx, "red component");
+ let g = args.require(ctx, "green component");
+ let b = args.require(ctx, "blue component");
+ let a = args.find(ctx);
+
+ let mut clamp = |component: Option<Spanned<f64>>, default| {
+ component.map_or(default, |c| {
+ if c.v < 0.0 || c.v > 1.0 {
+ ctx.diag(warning!(c.span, "should be between 0.0 and 1.0"));
+ }
+ (c.v.max(0.0).min(1.0) * 255.0).round() as u8
+ })
+ };
+
+ Value::Color(Color::Rgba(RgbaColor::new(
+ clamp(r, 0),
+ clamp(g, 0),
+ clamp(b, 0),
+ clamp(a, 255),
+ )))
+}