Current section

Files

Jump to
cleam src internal ast.gleam
Raw

src/internal/ast.gleam

import gleam/list
import internal/fs.{FileContent, FilesDir}
import glance.{type Module as AST}
import gleam/option.{None, Some}
pub type FileAst {
FileAst(AST)
}
pub type AnotherFilesAst {
AnotherFilesAst(List(FileAst))
}
pub fn files_ast(files_contents) {
use content <- list.map(files_contents)
let assert FileContent(content) = content
let assert Ok(ast) = glance.module(content)
FileAst(ast)
}
pub fn files_paths_with_ast(dir, test_dir) {
let file_paths = fs.files_paths(dir)
let flle_contents = fs.files_contents(file_paths)
let test_file_contents = case test_dir {
Some(FilesDir(_) as test_dir) -> {
fs.files_paths(test_dir)
|> fs.files_contents
}
None -> []
}
let ast_list =
flle_contents
|> list.append(test_file_contents)
|> files_ast
let indexes = list.range(0, list.length(ast_list) - 1)
use index <- list.filter_map(indexes)
case list.at(file_paths, index) {
Ok(file_path) -> {
let assert Ok(file_ast) = list.at(ast_list, index)
Ok(#(
file_path,
file_ast,
AnotherFilesAst(
list.filter_map(indexes, fn(idx) {
case idx == index {
True -> Error(Nil)
False -> list.at(ast_list, idx)
}
}),
),
))
}
Error(Nil) -> Error(Nil)
}
}