-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).