rant 4.0.0-alpha.33

The Rant procedural templating language
Documentation
use super::*;

pub fn split(vm: &mut VM, (s, at): (String, Option<String>)) -> RantStdResult {
  let list = if at.as_ref().map(|s| s.is_empty()).unwrap_or(true) {
    s.chars()
      .map(|c| c.to_string())
      .collect::<Vec<String>>()
  } else {
    s
      .split(at.unwrap().as_str())
      .map(|part| part.to_owned())
      .collect::<Vec<String>>()
  }.try_into_rant().into_runtime_result()?;

  vm.cur_frame_mut().write(list);
  Ok(())
}

pub fn lines(vm: &mut VM, s: String) -> RantStdResult {
  let lines: Vec<RantValue> = s.lines().map(|line| RantValue::String(line.into())).collect();
  vm.cur_frame_mut().write(lines);
  Ok(())
}

pub fn indent(vm:  &mut VM, (text, indent): (String, String)) -> RantStdResult {
  let frame = vm.cur_frame_mut();
  let mut first = true;
  for line in text.lines() {
    if first {
      first = false;
    } else {
      frame.write_frag("\n");
    }
    frame.write_frag(indent.as_str());
    frame.write_frag(line);
  }
  Ok(())
}

pub fn upper(vm: &mut VM, s: String) -> RantStdResult {
  vm.cur_frame_mut().write_frag(s.to_uppercase().as_str());
  Ok(())
}

pub fn lower(vm: &mut VM, s: String) -> RantStdResult {
  vm.cur_frame_mut().write_frag(s.to_lowercase().as_str());
  Ok(())
}

pub fn string_replace(vm: &mut VM, (input, query, replacement): (RantString, RantString, RantString)) -> RantStdResult {
  vm.cur_frame_mut().write_frag(input.as_str().replace(query.as_str(), replacement.as_str()).as_str());
  Ok(())
}

pub fn trim(vm: &mut VM, s: RantString) -> RantStdResult {
  vm.cur_frame_mut().write(s.as_str().trim());
  Ok(())
}

pub fn ord(vm: &mut VM, s: InternalString) -> RantStdResult {
  if s.is_empty() {
    return Ok(())
  }

  vm.cur_frame_mut().write(s.chars().next().unwrap() as u32);

  Ok(())
}

pub fn char_(vm: &mut VM, code_point: u32) -> RantStdResult {
  if let Some(c) = char::from_u32(code_point) {
    vm.cur_frame_mut().write(c);
  }
  Ok(())
}

pub fn ord_all(vm: &mut VM, s: InternalString) -> RantStdResult {
  vm.cur_frame_mut().write(s.chars().map(|c| (c as u32).into_rant()).collect::<RantList>());
  Ok(())
}