Current section
Files
Jump to
Current section
Files
src/kdleam@document.erl
-module(kdleam@document).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/kdleam/document.gleam").
-export([new_number_unchecked/3, new_number/3, number_raw/1, new_document/1, new_node/4, nodes/1, first_node/1, name/1, ty/1, entries/1, children/1, value/1, entry_ty/1, get/2, first_arg/1, as_string/1, as_bool/1, as_int/1, as_float/1, raw_number/1, first_string_arg/1, find_child/2, find_children/2, string_prop/2, bool_prop/2, int_prop/2, string_child_values/2]).
-export_type([kdl_document/0, kdl_node/0, kdl_entry/0, kdl_value/0, kdl_number/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" KDL 文書の型、構築関数、問い合わせ関数を提供する。\n").
-type kdl_document() :: {kdl_document, list(kdl_node())}.
-type kdl_node() :: {kdl_node,
gleam@option:option(binary()),
binary(),
list(kdl_entry()),
gleam@option:option(list(kdl_node()))}.
-type kdl_entry() :: {kdl_argument, gleam@option:option(binary()), kdl_value()} |
{kdl_property, binary(), gleam@option:option(binary()), kdl_value()}.
-type kdl_value() :: {kdl_string, binary()} |
{kdl_number_value, kdl_number()} |
{kdl_bool, boolean()} |
kdl_null.
-opaque kdl_number() :: {kdl_number,
binary(),
gleam@option:option(integer()),
gleam@option:option(float())}.
-file("src/kdleam/document.gleam", 42).
?DOC(false).
-spec new_number_unchecked(
binary(),
gleam@option:option(integer()),
gleam@option:option(float())
) -> kdl_number().
new_number_unchecked(Raw, As_int, As_float) ->
{kdl_number, Raw, As_int, As_float}.
-file("src/kdleam/document.gleam", 55).
?DOC(
" 検証済みの KDL v2 数値表現と整合する数値の値から数値を作る。\n"
"\n"
" 数値表現は呼び出し側で妥当性を確認する。空文字列は失敗する。\n"
" 整数値を指定する場合は、その整数を小数へ変換した値も指定する。\n"
" 数値構文そのものの検証には `kdleam.parse` を使う。\n"
).
-spec new_number(
binary(),
gleam@option:option(integer()),
gleam@option:option(float())
) -> {ok, kdl_number()} | {error, nil}.
new_number(Raw, As_int, As_float) ->
case Raw of
<<""/utf8>> ->
{error, nil};
_ ->
case As_int of
{some, I} ->
case As_float =:= {some, erlang:float(I)} of
true ->
{ok, {kdl_number, Raw, As_int, As_float}};
false ->
{error, nil}
end;
none ->
{ok, {kdl_number, Raw, As_int, As_float}}
end
end.
-file("src/kdleam/document.gleam", 75).
?DOC(false).
-spec number_raw(kdl_number()) -> binary().
number_raw(N) ->
erlang:element(2, N).
-file("src/kdleam/document.gleam", 80).
?DOC(" 指定したノード列から文書を作る。\n").
-spec new_document(list(kdl_node())) -> kdl_document().
new_document(Nodes) ->
{kdl_document, Nodes}.
-file("src/kdleam/document.gleam", 85).
?DOC(" 指定した名前、項目、子ノード、型注釈からノードを作る。\n").
-spec new_node(
binary(),
list(kdl_entry()),
gleam@option:option(list(kdl_node())),
gleam@option:option(binary())
) -> kdl_node().
new_node(Name, Entries, Children, Ty) ->
{kdl_node, Ty, Name, Entries, Children}.
-file("src/kdleam/document.gleam", 95).
?DOC(" 文書のノード列を返す。\n").
-spec nodes(kdl_document()) -> list(kdl_node()).
nodes(Doc) ->
{kdl_document, Nodes} = Doc,
Nodes.
-file("src/kdleam/document.gleam", 101).
?DOC(" 先頭ノードを返し、空の文書では `None` を返す。\n").
-spec first_node(kdl_document()) -> gleam@option:option(kdl_node()).
first_node(Doc) ->
case nodes(Doc) of
[Node | _] ->
{some, Node};
[] ->
none
end.
-file("src/kdleam/document.gleam", 109).
?DOC(" ノード名を返す。\n").
-spec name(kdl_node()) -> binary().
name(Node) ->
{kdl_node, _, Name, _, _} = Node,
Name.
-file("src/kdleam/document.gleam", 115).
?DOC(" ノードの型注釈を返し、無い場合は `None` を返す。\n").
-spec ty(kdl_node()) -> gleam@option:option(binary()).
ty(Node) ->
{kdl_node, Ty, _, _, _} = Node,
Ty.
-file("src/kdleam/document.gleam", 121).
?DOC(" ノードの項目列を返す。\n").
-spec entries(kdl_node()) -> list(kdl_entry()).
entries(Node) ->
{kdl_node, _, _, Entries, _} = Node,
Entries.
-file("src/kdleam/document.gleam", 127).
?DOC(" 子ノード列を返し、子ブロックが無い場合は `None` を返す。\n").
-spec children(kdl_node()) -> gleam@option:option(list(kdl_node())).
children(Node) ->
{kdl_node, _, _, _, Children} = Node,
Children.
-file("src/kdleam/document.gleam", 133).
?DOC(" 引数またはプロパティの値を返す。\n").
-spec value(kdl_entry()) -> kdl_value().
value(Entry) ->
case Entry of
{kdl_argument, _, Value} ->
Value;
{kdl_property, _, _, Value@1} ->
Value@1
end.
-file("src/kdleam/document.gleam", 141).
?DOC(" 項目の型注釈を返し、無い場合は `None` を返す。\n").
-spec entry_ty(kdl_entry()) -> gleam@option:option(binary()).
entry_ty(Entry) ->
case Entry of
{kdl_argument, Ty, _} ->
Ty;
{kdl_property, _, Ty@1, _} ->
Ty@1
end.
-file("src/kdleam/document.gleam", 278).
-spec result_to_option({ok, DLZ} | {error, any()}) -> gleam@option:option(DLZ).
result_to_option(Result) ->
case Result of
{ok, Value} ->
{some, Value};
{error, _} ->
none
end.
-file("src/kdleam/document.gleam", 149).
?DOC(" 指定した名前に最初に一致するプロパティの値を返し、無い場合は `None` を返す。\n").
-spec get(kdl_node(), binary()) -> gleam@option:option(kdl_value()).
get(Node, Key) ->
_pipe = entries(Node),
_pipe@1 = gleam@list:find_map(_pipe, fun(Entry) -> case Entry of
{kdl_property, K, _, Value} ->
case K =:= Key of
true ->
{ok, Value};
false ->
{error, nil}
end;
_ ->
{error, nil}
end end),
result_to_option(_pipe@1).
-file("src/kdleam/document.gleam", 165).
?DOC(" 最初の引数の値を返し、無い場合は `None` を返す。\n").
-spec first_arg(kdl_node()) -> gleam@option:option(kdl_value()).
first_arg(Node) ->
_pipe = entries(Node),
_pipe@1 = gleam@list:find_map(_pipe, fun(Entry) -> case Entry of
{kdl_argument, _, Value} ->
{ok, Value};
_ ->
{error, nil}
end end),
result_to_option(_pipe@1).
-file("src/kdleam/document.gleam", 177).
?DOC(" 文字列値を返し、値の種類が異なる場合は `None` を返す。\n").
-spec as_string(kdl_value()) -> gleam@option:option(binary()).
as_string(Value) ->
case Value of
{kdl_string, Value@1} ->
{some, Value@1};
_ ->
none
end.
-file("src/kdleam/document.gleam", 185).
?DOC(" 真偽値を返し、値の種類が異なる場合は `None` を返す。\n").
-spec as_bool(kdl_value()) -> gleam@option:option(boolean()).
as_bool(Value) ->
case Value of
{kdl_bool, Value@1} ->
{some, Value@1};
_ ->
none
end.
-file("src/kdleam/document.gleam", 193).
?DOC(" 表現可能な整数を返し、値の種類または表現範囲が合わない場合は `None` を返す。\n").
-spec as_int(kdl_value()) -> gleam@option:option(integer()).
as_int(Value) ->
case Value of
{kdl_number_value, {kdl_number, _, Value@1, _}} ->
Value@1;
_ ->
none
end.
-file("src/kdleam/document.gleam", 201).
?DOC(" 表現可能な小数を返し、値の種類または表現範囲が合わない場合は `None` を返す。\n").
-spec as_float(kdl_value()) -> gleam@option:option(float()).
as_float(Value) ->
case Value of
{kdl_number_value, {kdl_number, _, _, Value@1}} ->
Value@1;
_ ->
none
end.
-file("src/kdleam/document.gleam", 209).
?DOC(" 数値の生表現を返し、値の種類が異なる場合は `None` を返す。\n").
-spec raw_number(kdl_value()) -> gleam@option:option(binary()).
raw_number(Value) ->
case Value of
{kdl_number_value, {kdl_number, Raw, _, _}} ->
{some, Raw};
_ ->
none
end.
-file("src/kdleam/document.gleam", 217).
?DOC(" 最初の引数が文字列なら返し、それ以外は `None` を返す。\n").
-spec first_string_arg(kdl_node()) -> gleam@option:option(binary()).
first_string_arg(Node) ->
case first_arg(Node) of
{some, Value} ->
as_string(Value);
none ->
none
end.
-file("src/kdleam/document.gleam", 225).
?DOC(" 指定した名前に最初に一致する子ノードを返し、無い場合は `None` を返す。\n").
-spec find_child(kdl_node(), binary()) -> gleam@option:option(kdl_node()).
find_child(Node, Child_name) ->
_pipe = case children(Node) of
{some, Children} ->
gleam@list:find(
Children,
fun(Child) -> name(Child) =:= Child_name end
);
none ->
{error, nil}
end,
result_to_option(_pipe).
-file("src/kdleam/document.gleam", 235).
?DOC(" 指定した名前に一致するすべての子ノードを順序どおり返す。\n").
-spec find_children(kdl_node(), binary()) -> list(kdl_node()).
find_children(Node, Child_name) ->
case children(Node) of
{some, Children} ->
gleam@list:filter(
Children,
fun(Child) -> name(Child) =:= Child_name end
);
none ->
[]
end.
-file("src/kdleam/document.gleam", 244).
?DOC(" 指定したプロパティが文字列なら返し、それ以外は `None` を返す。\n").
-spec string_prop(kdl_node(), binary()) -> gleam@option:option(binary()).
string_prop(Node, Key) ->
case get(Node, Key) of
{some, Value} ->
as_string(Value);
none ->
none
end.
-file("src/kdleam/document.gleam", 252).
?DOC(" 指定したプロパティが真偽値なら返し、それ以外は `None` を返す。\n").
-spec bool_prop(kdl_node(), binary()) -> gleam@option:option(boolean()).
bool_prop(Node, Key) ->
case get(Node, Key) of
{some, Value} ->
as_bool(Value);
none ->
none
end.
-file("src/kdleam/document.gleam", 260).
?DOC(" 指定したプロパティが表現可能な整数なら返し、それ以外は `None` を返す。\n").
-spec int_prop(kdl_node(), binary()) -> gleam@option:option(integer()).
int_prop(Node, Key) ->
case get(Node, Key) of
{some, Value} ->
as_int(Value);
none ->
none
end.
-file("src/kdleam/document.gleam", 268).
?DOC(" 指定した名前の子ノードから、最初の引数が文字列である値だけを順序どおり返す。\n").
-spec string_child_values(kdl_node(), binary()) -> list(binary()).
string_child_values(Node, Child_name) ->
_pipe = find_children(Node, Child_name),
gleam@list:filter_map(_pipe, fun(Child) -> case first_string_arg(Child) of
{some, Value} ->
{ok, Value};
none ->
{error, nil}
end end).