From 4517297ecdf25cdbf1d9dc8f93b67319c0d7df13 Mon Sep 17 00:00:00 2001 From: Emiel Beinema Date: Fri, 4 Oct 2019 23:45:50 +0200 Subject: [PATCH] Allow channel string in rgb(a) --- src/functions/colors_rgb.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/functions/colors_rgb.rs b/src/functions/colors_rgb.rs index 50c982751..61cc1f172 100644 --- a/src/functions/colors_rgb.rs +++ b/src/functions/colors_rgb.rs @@ -1,6 +1,6 @@ use super::{make_call, Error, SassFunction}; -use crate::css::Value; -use crate::value::{Number, Unit}; +use crate::css::{CallArgs, Value}; +use crate::value::{Number, Quotes, Unit}; use crate::variablescope::Scope; use num_rational::Rational; use num_traits::{One, Zero}; @@ -26,6 +26,29 @@ fn do_rgba(fn_name: &str, s: &dyn Scope) -> Result { ], )), } + } else if let Value::List(vec, sep, bracketed) = red { + if vec.len() > 3 { + Err(Error::badarg( + "3 elements", + &Value::List(vec, sep, bracketed), + )) + } else { + // If less than 3 arguments are passed, one of the arguments could be a variable containing + // multiple values, so we want to preserve the original separator. + let call_args = if vec.len() < 3 { + CallArgs::new(vec![( + None, + Value::Literal( + format!("{}", Value::List(vec, sep, bracketed)), + Quotes::None, + ), + )]) + } else { + CallArgs::new(vec.into_iter().map(|v| (None, v)).collect()) + }; + + Ok(Value::Call(fn_name.into(), call_args)) + } } else { let green = s.get("green")?; let blue = s.get("blue")?;