Packages
caffeine_lang
2.0.1
6.3.1
6.3.0
6.2.2
6.2.1
6.2.0
6.1.2
6.1.1
6.1.0
6.0.0
5.6.0
5.5.0
5.4.4
5.4.3
5.4.2
5.4.1
5.4.0
5.3.0
5.2.0
5.1.1
5.1.0
5.0.12
5.0.11
5.0.10
5.0.8
5.0.7
5.0.6
5.0.5
5.0.4
5.0.1
5.0.0
4.10.0
4.9.0
4.8.3
4.8.2
4.8.1
4.8.0
4.7.9
4.7.8
4.7.7
4.7.6
4.7.5
4.6.7
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.7
4.3.6
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.0.2
1.0.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.2
0.0.1
A compiler for generating reliability artifacts from service expectation definitions.
Current section
Files
Jump to
Current section
Files
src/caffeine_lang/parser/file_discovery.gleam
import caffeine_lang/common/errors.{type CompilationError}
import gleam/list
import gleam/result
import gleam/string
import simplifile
/// This function returns a list of all JSON files in the given directory.
@internal
pub fn get_json_files(
base_directory: String,
) -> Result(List(String), CompilationError) {
use top_level_items <- result.try(read_directory_or_error(base_directory))
let json_file_paths =
top_level_items
|> list.try_fold([], fn(accumulated_files, item_name) {
process_top_level_item(base_directory, item_name, accumulated_files)
})
case json_file_paths {
Error(err) -> Error(err)
Ok([]) ->
Error(errors.LinkerParseError("No files found in: " <> base_directory))
Ok(files) -> Ok(files)
}
}
fn read_directory_or_error(
directory_path: String,
) -> Result(List(String), CompilationError) {
case simplifile.read_directory(directory_path) {
Ok(items) -> Ok(items)
Error(err) ->
Error(errors.LinkerParseError(
simplifile.describe_error(err) <> " (" <> directory_path <> ")",
))
}
}
fn process_top_level_item(
base_directory: String,
item_name: String,
accumulated_files: List(String),
) -> Result(List(String), CompilationError) {
let item_path = base_directory <> "/" <> item_name
case simplifile.is_directory(item_path) {
Ok(True) ->
collect_json_files_from_subdirectory(item_path, accumulated_files)
_ -> Ok(accumulated_files)
// Skip files at the top level
}
}
fn collect_json_files_from_subdirectory(
subdirectory_path: String,
accumulated_files: List(String),
) -> Result(List(String), CompilationError) {
use items_in_subdirectory <- result.try(read_directory_or_error(
subdirectory_path,
))
// Go one level deeper - iterate over nested directories and collect JSON files from each
items_in_subdirectory
|> list.try_fold(accumulated_files, fn(acc, item_name) {
let nested_path = subdirectory_path <> "/" <> item_name
case simplifile.is_directory(nested_path) {
Ok(True) -> {
use files_in_nested <- result.try(read_directory_or_error(nested_path))
let json_files =
extract_json_files_with_full_paths(files_in_nested, nested_path)
Ok(list.append(acc, json_files))
}
_ -> Ok(acc)
}
})
}
fn extract_json_files_with_full_paths(
files: List(String),
directory_path: String,
) -> List(String) {
files
|> list.filter(fn(file) { string.ends_with(file, ".json") })
|> list.map(fn(file) { directory_path <> "/" <> file })
}