Current section

Files

Jump to
parrot src parrot internal lib.gleam
Raw

src/parrot/internal/lib.gleam

//// Various gleam code utilities
////
import filepath
import gleam/bool
import gleam/dict.{type Dict}
import gleam/list
import gleam/result
import simplifile
pub const colorless = "\u{001b}[0m"
pub fn try_nil(
result: Result(a, b),
then do: fn(a) -> Result(c, Nil),
) -> Result(c, Nil) {
result.try(result.replace_error(result, Nil), do)
}
/// Finds all `from/**/sql` directories and lists the full paths of the `*.sql`
/// files inside each one.
/// https://github.com/giacomocavalieri/squirrel/blob/main/src/squirrel.gleam
///
pub fn walk(from: String) -> Dict(String, List(String)) {
case filepath.base_name(from) {
"sql" -> {
let assert Ok(files) = simplifile.read_directory(from)
let files = {
use file <- list.filter_map(files)
use extension <- result.try(filepath.extension(file))
use <- bool.guard(when: extension != "sql", return: Error(Nil))
let file_name = filepath.join(from, file)
case simplifile.is_file(file_name) {
Ok(True) -> Ok(file_name)
Ok(False) | Error(_) -> Error(Nil)
}
}
dict.from_list([#(from, files)])
}
_ -> {
let assert Ok(files) = simplifile.read_directory(from)
let directories = {
use file <- list.filter_map(files)
let file_name = filepath.join(from, file)
case simplifile.is_directory(file_name) {
Ok(True) -> Ok(file_name)
Ok(False) | Error(_) -> Error(Nil)
}
}
list.map(directories, walk)
|> list.fold(from: dict.new(), with: dict.merge)
}
}
}
pub fn green(text: String) {
"\u{001b}[32m" <> text <> colorless
}
pub fn red(text: String) {
"\u{001b}[31m" <> text <> colorless
}
pub fn yellow(text: String) {
"\u{001b}[33m" <> text <> colorless
}