-module(checkmark). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/checkmark.gleam"). -export([new/2, file/2, should_contain_contents_of/3, update/1, check/1, check_or_update/2]). -export_type([checker/1, file/1, check_error/1, snippet/0]). -opaque checker(EWT) :: {checker, fun((binary()) -> {ok, binary()} | {error, EWT}), fun((binary(), binary()) -> {ok, nil} | {error, EWT})}. -opaque file(EWU) :: {file, binary(), checker(EWU), list({binary(), binary()})}. -type check_error(EWV) :: {could_not_read_file, EWV} | {could_not_write_file, EWV} | {tag_not_found, binary()} | {multiple_tags_found, binary(), list(integer())} | {content_did_not_match, binary()}. -type snippet() :: {snippet, binary(), checkmark@internal@parser:fence(), gleam@option:option(checkmark@internal@parser:fence())}. -file("src/checkmark.gleam", 28). -spec new( fun((binary()) -> {ok, binary()} | {error, EWW}), fun((binary(), binary()) -> {ok, nil} | {error, EWW}) ) -> checker(EWW). new(Read_file, Write_file) -> {checker, Read_file, Write_file}. -file("src/checkmark.gleam", 35). -spec file(checker(EXC), binary()) -> file(EXC). file(Checker, Filename) -> {file, Filename, Checker, []}. -file("src/checkmark.gleam", 39). -spec should_contain_contents_of(file(EXF), binary(), binary()) -> file(EXF). should_contain_contents_of(File, Source, Tag) -> {file, erlang:element(2, File), erlang:element(3, File), [{Source, Tag} | erlang:element(4, File)]}. -file("src/checkmark.gleam", 138). -spec indent(splitter:splitter(), binary(), binary(), list(binary())) -> binary(). indent(Line_ends, With, Rest, Parts) -> case Rest of <<""/utf8>> -> _pipe = Parts, _pipe@1 = lists:reverse(_pipe), gleam@string:join(_pipe@1, <<""/utf8>>); _ -> {Content, Ending, Rest@1} = splitter_ffi:split(Line_ends, Rest), indent(Line_ends, With, Rest@1, [Ending, Content, With | Parts]) end. -file("src/checkmark.gleam", 153). -spec render_fence(checkmark@internal@parser:fence()) -> binary(). render_fence(Fence) -> <<<<(gleam@string:repeat(<<" "/utf8>>, erlang:element(4, Fence)))/binary, (erlang:element(2, Fence))/binary>>/binary, (erlang:element(3, Fence))/binary>>. -file("src/checkmark.gleam", 113). -spec render_code( checkmark@internal@parser:fence(), binary(), gleam@option:option(checkmark@internal@parser:fence()) ) -> binary(). render_code(Start_fence, Content, End_fence) -> Content@1 = case erlang:element(4, Start_fence) of 0 -> Content; Amount -> indent( splitter:new([<<"\n"/utf8>>, <<"\r\n"/utf8>>]), gleam@string:repeat(<<" "/utf8>>, Amount), Content, [] ) end, Without_end = <<(render_fence(Start_fence))/binary, Content@1/binary>>, case End_fence of none -> Without_end; {some, End_fence@1} -> <> end. -file("src/checkmark.gleam", 94). -spec render_replacements( list(checkmark@internal@parser:section()), gleam@dict:dict(binary(), binary()) ) -> binary(). render_replacements(Contents, Replacements) -> _pipe = Contents, _pipe@1 = gleam@list:map(_pipe, fun(Section) -> case Section of {fenced_code, _, Content, Start_fence, End_fence} -> case gleam_stdlib:map_get( Replacements, gleam@string:trim(erlang:element(3, Start_fence)) ) of {ok, Replacement} -> render_code(Start_fence, Replacement, End_fence); {error, _} -> render_code(Start_fence, Content, End_fence) end; {other, _, Content@1} -> Content@1 end end), gleam@string:join(_pipe@1, <<""/utf8>>). -file("src/checkmark.gleam", 165). -spec read_file(checker(EYM), binary()) -> {ok, binary()} | {error, check_error(EYM)}. read_file(Checker, Filename) -> _pipe = (erlang:element(2, Checker))(Filename), gleam@result:map_error( _pipe, fun(Field@0) -> {could_not_read_file, Field@0} end ). -file("src/checkmark.gleam", 157). -spec parse_file(file(EYF)) -> {ok, list(checkmark@internal@parser:section())} | {error, list(check_error(EYF))}. parse_file(File) -> _pipe = read_file(erlang:element(3, File), erlang:element(2, File)), _pipe@1 = gleam@result:map_error(_pipe, fun gleam@list:wrap/1), gleam@result:map(_pipe@1, fun checkmark@internal@parser:parse/1). -file("src/checkmark.gleam", 188). -spec find_match( list(checkmark@internal@parser:section()), binary(), list({integer(), snippet()}) ) -> {ok, snippet()} | {error, check_error(any())}. find_match(Content, Tag, Found) -> case Content of [] -> case Found of [] -> {error, {tag_not_found, Tag}}; [{_, Snippet}] -> {ok, Snippet}; _ -> {error, {multiple_tags_found, Tag, begin _pipe = Found, _pipe@1 = lists:reverse(_pipe), gleam@list:map( _pipe@1, fun(Pair) -> erlang:element(1, Pair) end ) end}} end; [{fenced_code, Line, Content@1, Start_fence, End_fence} | Rest] -> case gleam@string:trim(erlang:element(3, Start_fence)) =:= Tag of true -> Result = {Line, {snippet, Content@1, Start_fence, End_fence}}, find_match(Rest, Tag, [Result | Found]); false -> find_match(Rest, Tag, Found) end; [_ | Rest@1] -> find_match(Rest@1, Tag, Found) end. -file("src/checkmark.gleam", 73). -spec update(file(EXU)) -> {ok, nil} | {error, list(check_error(EXU))}. update(File) -> gleam@result:'try'( parse_file(File), fun(Contents) -> Results = begin gleam@list:map( erlang:element(4, File), fun(_use0) -> {Filename, Tag} = _use0, gleam@result:'try'( find_match(Contents, Tag, []), fun(_) -> gleam@result:'try'( read_file(erlang:element(3, File), Filename), fun(Expected) -> {ok, {Tag, Expected}} end ) end ) end ) end, {Replacements, Errors} = gleam@result:partition(Results), case Errors of [] -> Contents@1 = render_replacements( Contents, maps:from_list(Replacements) ), _pipe = (erlang:element(3, erlang:element(3, File)))( erlang:element(2, File), Contents@1 ), gleam@result:map_error( _pipe, fun(E) -> [{could_not_write_file, E}] end ); _ -> {error, Errors} end end ). -file("src/checkmark.gleam", 172). -spec check_one(list(checkmark@internal@parser:section()), binary(), binary()) -> {ok, nil} | {error, check_error(any())}. check_one(Content, Expected, Tag) -> gleam@result:'try'( find_match(Content, Tag, []), fun(Snippet) -> case erlang:element(2, Snippet) =:= Expected of true -> {ok, nil}; false -> {error, {content_did_not_match, Tag}} end end ). -file("src/checkmark.gleam", 57). -spec check(file(EXO)) -> {ok, nil} | {error, list(check_error(EXO))}. check(File) -> gleam@result:'try'( parse_file(File), fun(Contents) -> Results = begin gleam@list:map( erlang:element(4, File), fun(_use0) -> {Filename, Tag} = _use0, gleam@result:'try'( read_file(erlang:element(3, File), Filename), fun(Expected) -> check_one(Contents, Expected, Tag) end ) end ) end, {_, Errors} = gleam@result:partition(Results), case Errors of [] -> {ok, nil}; _ -> {error, Errors} end end ). -file("src/checkmark.gleam", 47). -spec check_or_update(file(EXI), boolean()) -> {ok, nil} | {error, list(check_error(EXI))}. check_or_update(File, Should_update) -> case Should_update of true -> update(File); false -> check(File) end.