module generator

import (
  std.alloc
  std.fs
)

let make_path(
  engine: *mut Engine,
  parts: ...str
): (std.fs.Path, bool) {
  let mut path = std.fs.Path.init(engine.allocator)
  if !path.push(engine.root) || !path.push(parts...) {
    fail(engine, "out of memory")
    return path, false
  }
  return path, true
}

let join_relative(
  engine: *mut Engine,
  left: str,
  right: str,
): (std.fs.Path, bool) {
  let mut path = std.fs.Path.init(engine.allocator)
  if @len(left) != 0 && !path.push(left) {
    fail(engine, "out of memory")
    return path, false
  }
  if !path.push(right) {
    fail(engine, "out of memory")
    return path, false
  }
  return path, true
}

let template_name_valid(name: str): bool {
  if @len(name) == 0 || std.fs.is_absolute(name) || name.contains("\\") {
    return false
  }
  let mut remaining = name
  for true {
    let slash, found = remaining.find("/")
    let component = if found { remaining[:slash] } else { remaining }
    if component.eq("") || component.eq(".") || component.eq("..") { return false }
    if !found { return true }
    remaining = remaining[slash + 1:]
  }
  return false
}