-module(pontil@context). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/pontil/context.gleam"). -export([describe_error/1, new/0, set_context_repo_from_event/2, is_push/1, is_pull_request/1, is_pull_request_target/1, is_issues/1, is_issue_comment/1, is_workflow_dispatch/1, is_release/1, is_workflow_run/1, is_deployment/1, is_create/1, is_delete/1, is_status/1, event/0, load_event/2, event_to_pull_request/2, event_to_issues/2, event_to_issue_comment/2, event_to_push/2, event_to_release/2, event_to_workflow_run/2, event_to_deployment/2, event_to_create/2, event_to_delete/2, event_to_status/2, get_string/2, get_bool/2, get_int/2, raw_to_repository/1, get_object/2, get_list/2, get_string_list/2, get_object_list/2, get_string_at/2, get_int_at/2, get_bool_at/2, get_object_at/2]). -export_type([pontil_context_error/0, repo/0, repository/0, context/0, git_user/0, git_hub_user_lite/0, issue_state/0, branch/0, commit/0, pull_request/0, issue/0, issue_comment/0, release/0, workflow_run/0, deployment/0, pull_request_event/0, issues_event/0, issue_comment_event/0, push_event/0, release_event/0, workflow_run_event/0, deployment_event/0, create_event/0, delete_event/0, status_event/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( " Context for GitHub Actions using pontil.\n" "\n" " This provides the `Context` type built from the GitHub Actions runtime\n" " environment, similar to the `context` object provided by `@actions/github`.\n" " It also provides webhook payload event loading and conversion, similar to\n" " the values in the `context.payload` field.\n" "\n" " ## Basic usage\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use pr <- result.try(context.load_event(\n" " event_name: ctx.event_name,\n" " converter: context.event_to_pull_request,\n" " ))\n" " let base_sha = pr.pull_request.base.sha\n" " let head_sha = pr.pull_request.head.sha\n" " ```\n" "\n" " ## Context\n" "\n" " The `new` function initializes the context from the GitHub Actions runtime\n" " environment. Values missing from or malformed in the runtime environment\n" " are set to empty strings (`\"\"`), zero (`0`), or `None` as appropriate. The\n" " context repo field may be updated with `set_context_repo_from_event`.\n" "\n" " ### Event type checking\n" "\n" " The action's event type may be tested in the context with `is_` functions\n" " (`is_push`, `is_issues`, `is_pull_request`, etc.).\n" "\n" " ## Event Data (Webhook Payload)\n" "\n" " The `event` function reads and parses the event webhook payload as\n" " a `Dict(String, Dynamic)` value from the JSON file at `GITHUB_EVENT_PATH`.\n" " The `load_event` convenience function combines `event` with a converter\n" " in one step.\n" "\n" " ### Event conversion\n" "\n" " The raw payload can be converted to typed event data with the `event_to_`\n" " conversion functions (`event_to_pull_request`, `event_to_issues`, etc.).\n" " Each takes an `event_name` string and the raw event data, returning\n" " `Error(InvalidEventConversion)` if the event name doesn't match.\n" "\n" " Converted event types (`PullRequestEvent`, `DeleteEvent`, etc.) contain\n" " event-level fields (`action`, `sender`, `repository`) and _may_ contain\n" " a detail field (`pull_request: PullRequest`) with nested data.\n" "\n" " ### Detailed Repository\n" "\n" " `get_repository` decodes a rich `Repository` from any event's\n" " `repository` field, which contains more information than is provided by\n" " the `Context.repo` field.\n" "\n" " ### Raw field access\n" "\n" " Every event record and its decoded member records includes a `raw` field\n" " (`Dict(String, Dynamic)`) with all original fields, including those not\n" " previously retrieved. Data can be retrieved with the `get_` functions\n" " (`get_string`, `get_int`, `get_bool_at`, etc.). These can be used to get\n" " fields that have not been included in the typed records.\n" ). -type pontil_context_error() :: missing_event_path | {missing_event_field, binary(), binary()} | {invalid_event_conversion, binary(), binary()} | {event_parse_error, gleam@json:decode_error()} | {event_read_error, simplifile:file_error()} | {raw_object_key_missing, binary()} | {raw_object_invalid_type, binary(), binary()}. -type repo() :: {repo, binary(), binary(), binary()}. -type repository() :: {repository, integer(), binary(), binary(), git_hub_user_lite(), boolean(), binary(), gleam@option:option(binary()), boolean(), binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type context() :: {context, binary(), binary(), binary(), binary(), binary(), binary(), binary(), gleam@option:option(repo()), integer(), integer(), integer(), binary(), binary(), binary()}. -type git_user() :: {git_user, gleam@option:option(binary()), gleam@option:option(binary()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type git_hub_user_lite() :: {git_hub_user_lite, binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type issue_state() :: open | closed. -type branch() :: {branch, binary(), binary(), binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type commit() :: {commit, binary(), binary(), binary(), git_user(), git_user(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type pull_request() :: {pull_request, integer(), binary(), binary(), gleam@option:option(binary()), issue_state(), gleam@option:option(boolean()), boolean(), boolean(), gleam@option:option(binary()), branch(), branch(), gleam@option:option(git_hub_user_lite()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type issue() :: {issue, integer(), binary(), binary(), gleam@option:option(binary()), issue_state(), boolean(), gleam@option:option(git_hub_user_lite()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type issue_comment() :: {issue_comment, integer(), binary(), gleam@option:option(git_hub_user_lite()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type release() :: {release, binary(), binary(), gleam@option:option(binary()), boolean(), boolean(), gleam@option:option(binary()), gleam@option:option(git_hub_user_lite()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type workflow_run() :: {workflow_run, integer(), gleam@option:option(binary()), gleam@option:option(binary()), binary(), binary(), gleam@option:option(binary()), binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type deployment() :: {deployment, integer(), binary(), binary(), binary(), gleam@option:option(binary()), gleam@option:option(git_hub_user_lite()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type pull_request_event() :: {pull_request_event, binary(), integer(), pull_request(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type issues_event() :: {issues_event, binary(), issue(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type issue_comment_event() :: {issue_comment_event, binary(), issue_comment(), issue(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type push_event() :: {push_event, binary(), binary(), binary(), boolean(), boolean(), boolean(), gleam@option:option(binary()), binary(), list(commit()), gleam@option:option(commit()), git_user(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type release_event() :: {release_event, binary(), release(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type workflow_run_event() :: {workflow_run_event, binary(), workflow_run(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type deployment_event() :: {deployment_event, binary(), deployment(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type create_event() :: {create_event, binary(), binary(), binary(), gleam@option:option(binary()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type delete_event() :: {delete_event, binary(), binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -type status_event() :: {status_event, binary(), binary(), binary(), gleam@option:option(binary()), gleam@option:option(binary()), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), git_hub_user_lite(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())}. -file("src/pontil/context.gleam", 96). ?DOC(" Returns a human-readable description of a pontil/context error.\n"). -spec describe_error(pontil_context_error()) -> binary(). describe_error(Error) -> case Error of missing_event_path -> <<"The event data cannot be loaded because GITHUB_EVENT_PATH is unset"/utf8>>; {missing_event_field, Field, Event_name} -> <<<<<<"Payload for event "/utf8, Event_name/binary>>/binary, " is missing a required field: "/utf8>>/binary, Field/binary>>; {invalid_event_conversion, Expected, Provided} -> <<<<<<"Cannot convert event to "/utf8, Expected/binary>>/binary, ": event is "/utf8>>/binary, Provided/binary>>; {event_parse_error, _} -> <<"Failed to parse webhook event JSON"/utf8>>; {event_read_error, Err} -> <<"Failed to read event data: "/utf8, (simplifile:describe_error(Err))/binary>>; {raw_object_key_missing, Key} -> <<"Key not found: "/utf8, Key/binary>>; {raw_object_invalid_type, Key@1, Expected@1} -> <<<<<<"Value at key "/utf8, Key@1/binary>>/binary, " is not "/utf8>>/binary, Expected@1/binary>> end. -file("src/pontil/context.gleam", 1246). -spec context_repo() -> gleam@option:option(repo()). context_repo() -> case envoy_ffi:get(<<"GITHUB_REPOSITORY"/utf8>>) of {ok, Full} -> case gleam@string:split_once(Full, <<"/"/utf8>>) of {ok, {Owner, Name}} -> {some, {repo, Full, Name, Owner}}; {error, nil} -> none end; {error, nil} -> none end. -file("src/pontil/context.gleam", 1702). -spec env(binary(), binary()) -> binary(). env(Name, Default) -> case envoy_ffi:get(Name) of {ok, Value} when Value =/= <<""/utf8>> -> Value; _ -> Default end. -file("src/pontil/context.gleam", 1709). -spec env_as_int(binary()) -> integer(). env_as_int(Name) -> _pipe = envoy_ffi:get(Name), _pipe@1 = gleam@result:'try'(_pipe, fun gleam_stdlib:parse_int/1), gleam@result:unwrap(_pipe@1, 0). -file("src/pontil/context.gleam", 596). ?DOC( " Return a `Context` from the runtime environment.\n" "\n" " Context should be created once and passed to functions that require it.\n" ). -spec new() -> context(). new() -> {context, env(<<"GITHUB_ACTION"/utf8>>, <<""/utf8>>), env(<<"GITHUB_ACTOR"/utf8>>, <<""/utf8>>), env(<<"GITHUB_API_URL"/utf8>>, <<"https://api.github.com"/utf8>>), env(<<"GITHUB_EVENT_NAME"/utf8>>, <<""/utf8>>), env( <<"GITHUB_GRAPHQL_URL"/utf8>>, <<"https://api.github.com/graphql"/utf8>> ), env(<<"GITHUB_JOB"/utf8>>, <<""/utf8>>), env(<<"GITHUB_REF"/utf8>>, <<""/utf8>>), context_repo(), env_as_int(<<"GITHUB_RUN_ATTEMPT"/utf8>>), env_as_int(<<"GITHUB_RUN_ID"/utf8>>), env_as_int(<<"GITHUB_RUN_NUMBER"/utf8>>), env(<<"GITHUB_SERVER_URL"/utf8>>, <<"https://github.com"/utf8>>), env(<<"GITHUB_SHA"/utf8>>, <<""/utf8>>), env(<<"GITHUB_WORKFLOW"/utf8>>, <<""/utf8>>)}. -file("src/pontil/context.gleam", 622). ?DOC( " Sets `Context.repo` from the webhook event's `repository` object.\n" "\n" " Returns the context unchanged if the event data does not contain a valid\n" " `repository` object.\n" ). -spec set_context_repo_from_event( context(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> context(). set_context_repo_from_event(Ctx, Event_data) -> case gleam_stdlib:map_get(Event_data, <<"repository"/utf8>>) of {ok, Repo} -> Decoder = begin gleam@dynamic@decode:subfield( [<<"owner"/utf8>>, <<"login"/utf8>>], {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Login) -> gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name) -> gleam@dynamic@decode:success({Login, Name}) end ) end ) end, _pipe = gleam@dynamic@decode:run(Repo, Decoder), _pipe@1 = gleam@result:map( _pipe, fun(Pair) -> {Owner, Name@1} = Pair, {context, erlang:element(2, Ctx), erlang:element(3, Ctx), erlang:element(4, Ctx), erlang:element(5, Ctx), erlang:element(6, Ctx), erlang:element(7, Ctx), erlang:element(8, Ctx), {some, {repo, <<<>/binary, Name@1/binary>>, Name@1, Owner}}, erlang:element(10, Ctx), erlang:element(11, Ctx), erlang:element(12, Ctx), erlang:element(13, Ctx), erlang:element(14, Ctx), erlang:element(15, Ctx)} end ), gleam@result:unwrap(_pipe@1, Ctx); {error, nil} -> Ctx end. -file("src/pontil/context.gleam", 648). ?DOC(" Returns `True` if this is a `push` event.\n"). -spec is_push(context()) -> boolean(). is_push(Ctx) -> erlang:element(5, Ctx) =:= <<"push"/utf8>>. -file("src/pontil/context.gleam", 653). ?DOC(" Returns `True` if this is a `pull_request` event.\n"). -spec is_pull_request(context()) -> boolean(). is_pull_request(Ctx) -> erlang:element(5, Ctx) =:= <<"pull_request"/utf8>>. -file("src/pontil/context.gleam", 658). ?DOC(" Returns `True` if this is a `pull_request_target` event.\n"). -spec is_pull_request_target(context()) -> boolean(). is_pull_request_target(Ctx) -> erlang:element(5, Ctx) =:= <<"pull_request_target"/utf8>>. -file("src/pontil/context.gleam", 663). ?DOC(" Returns `True` if this is an `issues` event.\n"). -spec is_issues(context()) -> boolean(). is_issues(Ctx) -> erlang:element(5, Ctx) =:= <<"issues"/utf8>>. -file("src/pontil/context.gleam", 668). ?DOC(" Returns `True` if this is an `issue_comment` event.\n"). -spec is_issue_comment(context()) -> boolean(). is_issue_comment(Ctx) -> erlang:element(5, Ctx) =:= <<"issue_comment"/utf8>>. -file("src/pontil/context.gleam", 673). ?DOC(" Returns `True` if this is a `workflow_dispatch` event.\n"). -spec is_workflow_dispatch(context()) -> boolean(). is_workflow_dispatch(Ctx) -> erlang:element(5, Ctx) =:= <<"workflow_dispatch"/utf8>>. -file("src/pontil/context.gleam", 678). ?DOC(" Returns `True` if this is a `release` event.\n"). -spec is_release(context()) -> boolean(). is_release(Ctx) -> erlang:element(5, Ctx) =:= <<"release"/utf8>>. -file("src/pontil/context.gleam", 683). ?DOC(" Returns `True` if this is a `workflow_run` event.\n"). -spec is_workflow_run(context()) -> boolean(). is_workflow_run(Ctx) -> erlang:element(5, Ctx) =:= <<"workflow_run"/utf8>>. -file("src/pontil/context.gleam", 688). ?DOC(" Returns `True` if this is a `deployment` event.\n"). -spec is_deployment(context()) -> boolean(). is_deployment(Ctx) -> erlang:element(5, Ctx) =:= <<"deployment"/utf8>>. -file("src/pontil/context.gleam", 693). ?DOC(" Returns `True` if this is a `create` event.\n"). -spec is_create(context()) -> boolean(). is_create(Ctx) -> erlang:element(5, Ctx) =:= <<"create"/utf8>>. -file("src/pontil/context.gleam", 698). ?DOC(" Returns `True` if this is a `delete` event.\n"). -spec is_delete(context()) -> boolean(). is_delete(Ctx) -> erlang:element(5, Ctx) =:= <<"delete"/utf8>>. -file("src/pontil/context.gleam", 703). ?DOC(" Returns `True` if this is a `status` event.\n"). -spec is_status(context()) -> boolean(). is_status(Ctx) -> erlang:element(5, Ctx) =:= <<"status"/utf8>>. -file("src/pontil/context.gleam", 713). ?DOC( " Load and parse the webhook event data from `GITHUB_EVENT_PATH`.\n" "\n" " Event should be created once and passed to functions that require it.\n" "\n" " Converting the raw event to a typed event as soon as practical is\n" " recommended, if the conversion exists.\n" ). -spec event() -> {ok, gleam@dict:dict(binary(), gleam@dynamic:dynamic_())} | {error, pontil_context_error()}. event() -> case envoy_ffi:get(<<"GITHUB_EVENT_PATH"/utf8>>) of {ok, Path} when Path =/= <<""/utf8>> -> case simplifile:read(Path) of {ok, Contents} -> case gleam@json:parse( Contents, gleam@dynamic@decode:dict( {decoder, fun gleam@dynamic@decode:decode_string/1}, {decoder, fun gleam@dynamic@decode:decode_dynamic/1} ) ) of {ok, P} -> {ok, P}; {error, E} -> {error, {event_parse_error, E}} end; {error, E@1} -> {error, {event_read_error, E@1}} end; _ -> {error, missing_event_path} end. -file("src/pontil/context.gleam", 746). ?DOC( " Load, parse, and convert the webhook event in one step.\n" "\n" " Reads the event file from `GITHUB_EVENT_PATH` and converts it to the typed\n" " event type withe provided converter function.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use pr <- result.try(context.load_event(\n" " event_name: ctx.event_name,\n" " converter: context.event_to_pull_request,\n" " ))\n" "\n" " // Equivalent to:\n" " use event <- result.try(context.event())\n" " use pr <- result.try(context.event_to_pull_request(ctx.event_name, event))\n" " ```\n" ). -spec load_event( binary(), fun((binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, EAK} | {error, pontil_context_error()}) ) -> {ok, EAK} | {error, pontil_context_error()}. load_event(Event_name, Converter) -> gleam@result:'try'(event(), fun(Ev) -> Converter(Event_name, Ev) end). -file("src/pontil/context.gleam", 1257). -spec with_event_name({ok, ECY} | {error, pontil_context_error()}, binary()) -> {ok, ECY} | {error, pontil_context_error()}. with_event_name(Result, Name) -> gleam@result:map_error(Result, fun(Err) -> case Err of {missing_event_field, Field, <<""/utf8>>} -> {missing_event_field, Field, Name}; _ -> Err end end). -file("src/pontil/context.gleam", 1698). -spec raw_decoder() -> gleam@dynamic@decode:decoder(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())). raw_decoder() -> gleam@dynamic@decode:dict( {decoder, fun gleam@dynamic@decode:decode_string/1}, {decoder, fun gleam@dynamic@decode:decode_dynamic/1} ). -file("src/pontil/context.gleam", 1530). -spec github_user_lite_decoder() -> gleam@dynamic@decode:decoder(git_hub_user_lite()). github_user_lite_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"login"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Login) -> gleam@dynamic@decode:success( {git_hub_user_lite, Login, Raw} ) end ) end ). -file("src/pontil/context.gleam", 1355). -spec require_decoded( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary(), gleam@dynamic@decode:decoder(EDZ) ) -> {ok, EDZ} | {error, pontil_context_error()}. require_decoded(Raw, Key, Decoder) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> _pipe = gleam@dynamic@decode:run(D, Decoder), gleam@result:replace_error( _pipe, {missing_event_field, Key, <<""/utf8>>} ); {error, nil} -> {error, {missing_event_field, Key, <<""/utf8>>}} end. -file("src/pontil/context.gleam", 1292). -spec require_int(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok, integer()} | {error, pontil_context_error()}. require_int(Raw, Key) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> _pipe = gleam@dynamic@decode:run( D, {decoder, fun gleam@dynamic@decode:decode_int/1} ), gleam@result:replace_error( _pipe, {missing_event_field, Key, <<""/utf8>>} ); {error, nil} -> {error, {missing_event_field, Key, <<""/utf8>>}} end. -file("src/pontil/context.gleam", 1280). -spec require_string( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary() ) -> {ok, binary()} | {error, pontil_context_error()}. require_string(Raw, Key) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> _pipe = gleam@dynamic@decode:run( D, {decoder, fun gleam@dynamic@decode:decode_string/1} ), gleam@result:replace_error( _pipe, {missing_event_field, Key, <<""/utf8>>} ); {error, nil} -> {error, {missing_event_field, Key, <<""/utf8>>}} end. -file("src/pontil/context.gleam", 1507). -spec pr_branch_decoder() -> gleam@dynamic@decode:decoder(branch()). pr_branch_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"sha"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Sha) -> gleam@dynamic@decode:field( <<"ref"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Ref) -> gleam@dynamic@decode:optional_field( <<"label"/utf8>>, <<""/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Label) -> gleam@dynamic@decode:success( {branch, Sha, Ref, Label, Raw} ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 1498). -spec issue_state_decoder() -> gleam@dynamic@decode:decoder(issue_state()). issue_state_decoder() -> gleam@dynamic@decode:then( {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Value) -> case Value of <<"open"/utf8>> -> gleam@dynamic@decode:success(open); <<"closed"/utf8>> -> gleam@dynamic@decode:success(closed); _ -> gleam@dynamic@decode:failure(open, <<"IssueState"/utf8>>) end end ). -file("src/pontil/context.gleam", 1368). -spec pull_request_decoder() -> gleam@dynamic@decode:decoder(pull_request()). pull_request_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"number"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Number) -> gleam@dynamic@decode:field( <<"html_url"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Html_url) -> gleam@dynamic@decode:field( <<"title"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Title) -> gleam@dynamic@decode:field( <<"body"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Body) -> gleam@dynamic@decode:field( <<"state"/utf8>>, issue_state_decoder(), fun(State) -> gleam@dynamic@decode:field( <<"merged"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_bool/1} ), fun(Merged) -> gleam@dynamic@decode:optional_field( <<"draft"/utf8>>, false, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Draft) -> gleam@dynamic@decode:field( <<"locked"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun( Locked ) -> gleam@dynamic@decode:field( <<"merge_commit_sha"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun( Merge_commit_sha ) -> gleam@dynamic@decode:field( <<"base"/utf8>>, pr_branch_decoder( ), fun( Base ) -> gleam@dynamic@decode:field( <<"head"/utf8>>, pr_branch_decoder( ), fun( Head ) -> gleam@dynamic@decode:field( <<"user"/utf8>>, gleam@dynamic@decode:optional( github_user_lite_decoder( ) ), fun( User ) -> gleam@dynamic@decode:success( {pull_request, Number, Html_url, Title, Body, State, Merged, Draft, Locked, Merge_commit_sha, Base, Head, User, Raw} ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 1269). -spec check_event_name(binary(), list(binary())) -> {ok, nil} | {error, pontil_context_error()}. check_event_name(Provided, Allowed) -> gleam@bool:guard( gleam@list:contains(Allowed, Provided), {ok, nil}, fun() -> Expected = gleam@string:join(Allowed, <<", "/utf8>>), {error, {invalid_event_conversion, Expected, Provided}} end ). -file("src/pontil/context.gleam", 763). ?DOC( " Convert event data to a `PullRequestEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use pr <- context.event_to_pull_request(ctx.event_name, event)\n" " ```\n" "\n" " Works for both `pull_request` and `pull_request_target` events.\n" ). -spec event_to_pull_request( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, pull_request_event()} | {error, pontil_context_error()}. event_to_pull_request(Event_name, Event_data) -> gleam@result:'try'( check_event_name( Event_name, [<<"pull_request"/utf8>>, <<"pull_request_target"/utf8>>] ), fun(_) -> Raw = Event_data, _pipe = begin gleam@result:'try'( require_decoded( Raw, <<"pull_request"/utf8>>, pull_request_decoder() ), fun(Pr) -> gleam@result:'try'( require_string(Raw, <<"action"/utf8>>), fun(Action) -> gleam@result:'try'( require_int(Raw, <<"number"/utf8>>), fun(Number) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder( ) ), fun(Sender) -> {ok, {pull_request_event, Action, Number, Pr, Repository, Sender, Raw}} end ) end ) end ) end ) end ) end, with_event_name(_pipe, <<"pull_request"/utf8>>) end ). -file("src/pontil/context.gleam", 1402). -spec issue_decoder() -> gleam@dynamic@decode:decoder(issue()). issue_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"number"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Number) -> gleam@dynamic@decode:field( <<"html_url"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Html_url) -> gleam@dynamic@decode:field( <<"title"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Title) -> gleam@dynamic@decode:field( <<"body"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Body) -> gleam@dynamic@decode:optional_field( <<"state"/utf8>>, open, issue_state_decoder(), fun(State) -> gleam@dynamic@decode:optional_field( <<"locked"/utf8>>, false, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Locked) -> gleam@dynamic@decode:field( <<"user"/utf8>>, gleam@dynamic@decode:optional( github_user_lite_decoder( ) ), fun(User) -> gleam@dynamic@decode:success( {issue, Number, Html_url, Title, Body, State, Locked, User, Raw} ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 811). ?DOC( " Convert event data to an `IssuesEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use issue <- context.event_to_issues(ctx.event_name, event)\n" " ```\n" ). -spec event_to_issues( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, issues_event()} | {error, pontil_context_error()}. event_to_issues(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"issues"/utf8>>]), fun(_) -> Raw = Event_data, _pipe = begin gleam@result:'try'( require_decoded(Raw, <<"issue"/utf8>>, issue_decoder()), fun(Issue) -> gleam@result:'try'( require_string(Raw, <<"action"/utf8>>), fun(Action) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder() ), fun(Sender) -> {ok, {issues_event, Action, Issue, Repository, Sender, Raw}} end ) end ) end ) end ) end, with_event_name(_pipe, <<"issues"/utf8>>) end ). -file("src/pontil/context.gleam", 1423). -spec issue_comment_decoder() -> gleam@dynamic@decode:decoder(issue_comment()). issue_comment_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Id) -> gleam@dynamic@decode:field( <<"body"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Body) -> gleam@dynamic@decode:field( <<"user"/utf8>>, gleam@dynamic@decode:optional( github_user_lite_decoder() ), fun(User) -> gleam@dynamic@decode:success( {issue_comment, Id, Body, User, Raw} ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 846). ?DOC( " Convert event data to an `IssueCommentEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use issue_comment <- context.event_to_issue_comment(ctx.event_name, event)\n" " ```\n" ). -spec event_to_issue_comment( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, issue_comment_event()} | {error, pontil_context_error()}. event_to_issue_comment(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"issue_comment"/utf8>>]), fun(_) -> Raw = Event_data, _pipe = begin gleam@result:'try'( require_decoded( Raw, <<"comment"/utf8>>, issue_comment_decoder() ), fun(Comment) -> gleam@result:'try'( require_decoded( Raw, <<"issue"/utf8>>, issue_decoder() ), fun(Issue) -> gleam@result:'try'( require_string(Raw, <<"action"/utf8>>), fun(Action) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder( ) ), fun(Sender) -> {ok, {issue_comment_event, Action, Comment, Issue, Repository, Sender, Raw}} end ) end ) end ) end ) end ) end, with_event_name(_pipe, <<"issue_comment"/utf8>>) end ). -file("src/pontil/context.gleam", 1515). -spec git_user_decoder() -> gleam@dynamic@decode:decoder(git_user()). git_user_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:optional_field( <<"name"/utf8>>, none, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Name) -> gleam@dynamic@decode:optional_field( <<"email"/utf8>>, none, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Email) -> gleam@dynamic@decode:success( {git_user, Name, Email, Raw} ) end ) end ) end ). -file("src/pontil/context.gleam", 1694). -spec empty_git_user() -> git_user(). empty_git_user() -> {git_user, none, none, maps:new()}. -file("src/pontil/context.gleam", 1536). -spec push_commit_decoder() -> gleam@dynamic@decode:decoder(commit()). push_commit_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:optional_field( <<"id"/utf8>>, <<""/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Id) -> gleam@dynamic@decode:optional_field( <<"message"/utf8>>, <<""/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Message) -> gleam@dynamic@decode:optional_field( <<"timestamp"/utf8>>, <<""/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Timestamp) -> gleam@dynamic@decode:optional_field( <<"author"/utf8>>, empty_git_user(), git_user_decoder(), fun(Author) -> gleam@dynamic@decode:optional_field( <<"committer"/utf8>>, empty_git_user(), git_user_decoder(), fun(Committer) -> gleam@dynamic@decode:success( {commit, Id, Message, Timestamp, Author, Committer, Raw} ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 1330). -spec require_nullable( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary(), gleam@dynamic@decode:decoder(EDP) ) -> {ok, gleam@option:option(EDP)} | {error, pontil_context_error()}. require_nullable(Raw, Key, Decoder) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> {ok, begin _pipe = gleam@dynamic@decode:run( D, gleam@dynamic@decode:optional(Decoder) ), gleam@result:unwrap(_pipe, none) end}; {error, nil} -> {error, {missing_event_field, Key, <<""/utf8>>}} end. -file("src/pontil/context.gleam", 1342). -spec require_list( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary(), gleam@dynamic@decode:decoder(EDU) ) -> {ok, list(EDU)} | {error, pontil_context_error()}. require_list(Raw, Key, Decoder) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> _pipe = gleam@dynamic@decode:run( D, gleam@dynamic@decode:list(Decoder) ), gleam@result:replace_error( _pipe, {missing_event_field, Key, <<""/utf8>>} ); {error, nil} -> {error, {missing_event_field, Key, <<""/utf8>>}} end. -file("src/pontil/context.gleam", 1316). -spec require_nullable_string( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary() ) -> {ok, gleam@option:option(binary())} | {error, pontil_context_error()}. require_nullable_string(Raw, Key) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> {ok, begin _pipe = gleam@dynamic@decode:run( D, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ) ), gleam@result:unwrap(_pipe, none) end}; {error, nil} -> {error, {missing_event_field, Key, <<""/utf8>>}} end. -file("src/pontil/context.gleam", 1304). -spec require_bool( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary() ) -> {ok, boolean()} | {error, pontil_context_error()}. require_bool(Raw, Key) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> _pipe = gleam@dynamic@decode:run( D, {decoder, fun gleam@dynamic@decode:decode_bool/1} ), gleam@result:replace_error( _pipe, {missing_event_field, Key, <<""/utf8>>} ); {error, nil} -> {error, {missing_event_field, Key, <<""/utf8>>}} end. -file("src/pontil/context.gleam", 1554). -spec decode_push_event(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, push_event()} | {error, pontil_context_error()}. decode_push_event(Event_data) -> Raw = Event_data, gleam@result:'try'( require_string(Raw, <<"ref"/utf8>>), fun(Ref) -> gleam@result:'try'( require_string(Raw, <<"before"/utf8>>), fun(Before) -> gleam@result:'try'( require_string(Raw, <<"after"/utf8>>), fun(After) -> gleam@result:'try'( require_string(Raw, <<"compare"/utf8>>), fun(Compare) -> gleam@result:'try'( require_bool(Raw, <<"created"/utf8>>), fun(Created) -> gleam@result:'try'( require_bool( Raw, <<"deleted"/utf8>> ), fun(Deleted) -> gleam@result:'try'( require_bool( Raw, <<"forced"/utf8>> ), fun(Forced) -> gleam@result:'try'( require_nullable_string( Raw, <<"base_ref"/utf8>> ), fun(Base_ref) -> gleam@result:'try'( require_list( Raw, <<"commits"/utf8>>, push_commit_decoder( ) ), fun( Commits ) -> gleam@result:'try'( require_nullable( Raw, <<"head_commit"/utf8>>, push_commit_decoder( ) ), fun( Head_commit ) -> gleam@result:'try'( require_decoded( Raw, <<"pusher"/utf8>>, git_user_decoder( ) ), fun( Pusher ) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder( ) ), fun( Repository ) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder( ) ), fun( Sender ) -> {ok, {push_event, Ref, Before, After, Created, Deleted, Forced, Base_ref, Compare, Commits, Head_commit, Pusher, Repository, Sender, Raw}} end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 888). ?DOC( " Convert event data to a `PushEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use push <- context.event_to_push(ctx.event_name, event)\n" " ```\n" ). -spec event_to_push( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, push_event()} | {error, pontil_context_error()}. event_to_push(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"push"/utf8>>]), fun(_) -> _pipe = decode_push_event(Event_data), with_event_name(_pipe, <<"push"/utf8>>) end ). -file("src/pontil/context.gleam", 1431). -spec release_decoder() -> gleam@dynamic@decode:decoder(release()). release_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"tag_name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Tag_name) -> gleam@dynamic@decode:field( <<"target_commitish"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Target_commitish) -> gleam@dynamic@decode:field( <<"name"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Name) -> gleam@dynamic@decode:field( <<"draft"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Draft) -> gleam@dynamic@decode:field( <<"prerelease"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Prerelease) -> gleam@dynamic@decode:field( <<"body"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Body) -> gleam@dynamic@decode:field( <<"author"/utf8>>, gleam@dynamic@decode:optional( github_user_lite_decoder( ) ), fun(Author) -> gleam@dynamic@decode:success( {release, Tag_name, Target_commitish, Name, Draft, Prerelease, Body, Author, Raw} ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 903). ?DOC( " Convert event data to a `ReleaseEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use release <- context.event_to_release(ctx.event_name, event)\n" " ```\n" ). -spec event_to_release( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, release_event()} | {error, pontil_context_error()}. event_to_release(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"release"/utf8>>]), fun(_) -> Raw = Event_data, _pipe = begin gleam@result:'try'( require_decoded(Raw, <<"release"/utf8>>, release_decoder()), fun(Release) -> gleam@result:'try'( require_string(Raw, <<"action"/utf8>>), fun(Action) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder() ), fun(Sender) -> {ok, {release_event, Action, Release, Repository, Sender, Raw}} end ) end ) end ) end ) end, with_event_name(_pipe, <<"release"/utf8>>) end ). -file("src/pontil/context.gleam", 1455). -spec workflow_run_decoder() -> gleam@dynamic@decode:decoder(workflow_run()). workflow_run_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Id) -> gleam@dynamic@decode:field( <<"name"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Name) -> gleam@dynamic@decode:field( <<"head_branch"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Head_branch) -> gleam@dynamic@decode:field( <<"head_sha"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Head_sha) -> gleam@dynamic@decode:field( <<"status"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Status) -> gleam@dynamic@decode:field( <<"conclusion"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Conclusion) -> gleam@dynamic@decode:field( <<"event"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Event) -> gleam@dynamic@decode:success( {workflow_run, Id, Name, Head_branch, Head_sha, Status, Conclusion, Event, Raw} ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 938). ?DOC( " Convert event data to a `WorkflowRunEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use workflow_run <- context.event_to_workflow_run(ctx.event_name, event)\n" " ```\n" ). -spec event_to_workflow_run( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, workflow_run_event()} | {error, pontil_context_error()}. event_to_workflow_run(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"workflow_run"/utf8>>]), fun(_) -> Raw = Event_data, _pipe = begin gleam@result:'try'( require_decoded( Raw, <<"workflow_run"/utf8>>, workflow_run_decoder() ), fun(Wf_run) -> gleam@result:'try'( require_string(Raw, <<"action"/utf8>>), fun(Action) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder() ), fun(Sender) -> {ok, {workflow_run_event, Action, Wf_run, Repository, Sender, Raw}} end ) end ) end ) end ) end, with_event_name(_pipe, <<"workflow_run"/utf8>>) end ). -file("src/pontil/context.gleam", 1476). -spec deployment_decoder() -> gleam@dynamic@decode:decoder(deployment()). deployment_decoder() -> gleam@dynamic@decode:then( raw_decoder(), fun(Raw) -> gleam@dynamic@decode:field( <<"id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Id) -> gleam@dynamic@decode:field( <<"ref"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Ref) -> gleam@dynamic@decode:field( <<"sha"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Sha) -> gleam@dynamic@decode:field( <<"environment"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Environment) -> gleam@dynamic@decode:field( <<"description"/utf8>>, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Description) -> gleam@dynamic@decode:field( <<"creator"/utf8>>, gleam@dynamic@decode:optional( github_user_lite_decoder( ) ), fun(Creator) -> gleam@dynamic@decode:success( {deployment, Id, Ref, Sha, Environment, Description, Creator, Raw} ) end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 981). ?DOC( " Convert event data to a `DeploymentEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use deployment <- context.event_to_deployment(ctx.event_name, event)\n" " ```\n" ). -spec event_to_deployment( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, deployment_event()} | {error, pontil_context_error()}. event_to_deployment(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"deployment"/utf8>>]), fun(_) -> Raw = Event_data, _pipe = begin gleam@result:'try'( require_decoded( Raw, <<"deployment"/utf8>>, deployment_decoder() ), fun(Dep) -> gleam@result:'try'( require_string(Raw, <<"action"/utf8>>), fun(Action) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder() ), fun(Sender) -> {ok, {deployment_event, Action, Dep, Repository, Sender, Raw}} end ) end ) end ) end ) end, with_event_name(_pipe, <<"deployment"/utf8>>) end ). -file("src/pontil/context.gleam", 1609). -spec decode_create_event(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, create_event()} | {error, pontil_context_error()}. decode_create_event(Event_data) -> Raw = Event_data, gleam@result:'try'( require_string(Raw, <<"ref"/utf8>>), fun(Ref) -> gleam@result:'try'( require_string(Raw, <<"ref_type"/utf8>>), fun(Ref_type) -> gleam@result:'try'( require_string(Raw, <<"master_branch"/utf8>>), fun(Master_branch) -> gleam@result:'try'( require_nullable_string( Raw, <<"description"/utf8>> ), fun(Description) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder() ), fun(Sender) -> {ok, {create_event, Ref, Ref_type, Master_branch, Description, Repository, Sender, Raw}} end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 1018). ?DOC( " Convert event data to a `CreateEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use create <- context.event_to_create(ctx.event_name, event)\n" " ```\n" ). -spec event_to_create( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, create_event()} | {error, pontil_context_error()}. event_to_create(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"create"/utf8>>]), fun(_) -> _pipe = decode_create_event(Event_data), with_event_name(_pipe, <<"create"/utf8>>) end ). -file("src/pontil/context.gleam", 1641). -spec decode_delete_event(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, delete_event()} | {error, pontil_context_error()}. decode_delete_event(Event_data) -> Raw = Event_data, gleam@result:'try'( require_string(Raw, <<"ref"/utf8>>), fun(Ref) -> gleam@result:'try'( require_string(Raw, <<"ref_type"/utf8>>), fun(Ref_type) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder() ), fun(Sender) -> {ok, {delete_event, Ref, Ref_type, Repository, Sender, Raw}} end ) end ) end ) end ). -file("src/pontil/context.gleam", 1033). ?DOC( " Convert event data to a `DeleteEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use delete <- context.event_to_delete(ctx.event_name, event)\n" " ```\n" ). -spec event_to_delete( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, delete_event()} | {error, pontil_context_error()}. event_to_delete(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"delete"/utf8>>]), fun(_) -> _pipe = decode_delete_event(Event_data), with_event_name(_pipe, <<"delete"/utf8>>) end ). -file("src/pontil/context.gleam", 1660). -spec decode_status_event(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, status_event()} | {error, pontil_context_error()}. decode_status_event(Event_data) -> Raw = Event_data, gleam@result:'try'( require_string(Raw, <<"sha"/utf8>>), fun(Sha) -> gleam@result:'try'( require_string(Raw, <<"state"/utf8>>), fun(State) -> gleam@result:'try'( require_string(Raw, <<"context"/utf8>>), fun(Ctx_name) -> gleam@result:'try'( require_nullable_string( Raw, <<"description"/utf8>> ), fun(Description) -> gleam@result:'try'( require_nullable_string( Raw, <<"target_url"/utf8>> ), fun(Target_url) -> gleam@result:'try'( require_decoded( Raw, <<"repository"/utf8>>, raw_decoder() ), fun(Repository) -> gleam@result:'try'( require_decoded( Raw, <<"sender"/utf8>>, github_user_lite_decoder( ) ), fun(Sender) -> {ok, {status_event, Sha, State, Ctx_name, Description, Target_url, Repository, Sender, Raw}} end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 1048). ?DOC( " Convert event data to a `StatusEvent`.\n" "\n" " ```gleam\n" " let ctx = context.new()\n" " use event <- result.try(context.event())\n" " use status <- context.event_to_status(ctx.event_name, event)\n" " ```\n" ). -spec event_to_status( binary(), gleam@dict:dict(binary(), gleam@dynamic:dynamic_()) ) -> {ok, status_event()} | {error, pontil_context_error()}. event_to_status(Event_name, Event_data) -> gleam@result:'try'( check_event_name(Event_name, [<<"status"/utf8>>]), fun(_) -> _pipe = decode_status_event(Event_data), with_event_name(_pipe, <<"status"/utf8>>) end ). -file("src/pontil/context.gleam", 1212). -spec decode_field( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary(), binary(), gleam@dynamic@decode:decoder(ECO) ) -> {ok, ECO} | {error, pontil_context_error()}. decode_field(Raw, Key, Expected, Decoder) -> case gleam_stdlib:map_get(Raw, Key) of {ok, D} -> _pipe = gleam@dynamic@decode:run(D, Decoder), gleam@result:replace_error( _pipe, {raw_object_invalid_type, Key, Expected} ); {error, nil} -> {error, {raw_object_key_missing, Key}} end. -file("src/pontil/context.gleam", 1110). ?DOC(" Get a string value from a `RawObject` by key.\n"). -spec get_string(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok, binary()} | {error, pontil_context_error()}. get_string(Raw, Key) -> decode_field( Raw, Key, <<"a string"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1} ). -file("src/pontil/context.gleam", 1126). ?DOC(" Get a bool value from a `RawObject` by key.\n"). -spec get_bool(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok, boolean()} | {error, pontil_context_error()}. get_bool(Raw, Key) -> decode_field( Raw, Key, <<"a bool"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1} ). -file("src/pontil/context.gleam", 1118). ?DOC(" Get an int value from a `RawObject` by key.\n"). -spec get_int(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok, integer()} | {error, pontil_context_error()}. get_int(Raw, Key) -> decode_field( Raw, Key, <<"an int"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1} ). -file("src/pontil/context.gleam", 1071). ?DOC( " Convert a `RawObject` into a `Repository` (usually found in an event's\n" " `repository` field).\n" "\n" " ```gleam\n" " // From raw event data\n" " use ev <- result.try(context.event())\n" " use repo <- result.try(context.get_object(ev, \"repository\"))\n" " use repo <- result.try(context.raw_to_repository(repo))\n" "\n" " // From a typed event\n" " use pr <- result.try(\n" " context.load_event(\"pull_request\", context.event_to_pull_request)\n" " )\n" " use repo <- result.try(context.raw_to_repository(pr.repository))\n" " ```\n" ). -spec raw_to_repository(gleam@dict:dict(binary(), gleam@dynamic:dynamic_())) -> {ok, repository()} | {error, pontil_context_error()}. raw_to_repository(Raw) -> gleam@result:'try'( get_int(Raw, <<"id"/utf8>>), fun(Id) -> gleam@result:'try'( get_string(Raw, <<"name"/utf8>>), fun(Name) -> gleam@result:'try'( get_string(Raw, <<"full_name"/utf8>>), fun(Full_name) -> gleam@result:'try'( decode_field( Raw, <<"owner"/utf8>>, <<"a user object"/utf8>>, github_user_lite_decoder() ), fun(Owner) -> gleam@result:'try'( get_bool(Raw, <<"private"/utf8>>), fun(Private) -> gleam@result:'try'( get_string( Raw, <<"html_url"/utf8>> ), fun(Html_url) -> gleam@result:'try'( case gleam_stdlib:map_get( Raw, <<"description"/utf8>> ) of {ok, D} -> {ok, begin _pipe = gleam@dynamic@decode:run( D, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ) ), gleam@result:unwrap( _pipe, none ) end}; {error, nil} -> {error, {raw_object_key_missing, <<"description"/utf8>>}} end, fun(Description) -> gleam@result:'try'( get_bool( Raw, <<"fork"/utf8>> ), fun(Fork) -> gleam@result:'try'( get_string( Raw, <<"default_branch"/utf8>> ), fun( Default_branch ) -> {ok, {repository, Id, Name, Full_name, Owner, Private, Html_url, Description, Fork, Default_branch, Raw}} end ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/pontil/context.gleam", 1134). ?DOC(" Get a nested object from a `RawObject` by key.\n"). -spec get_object(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok, gleam@dict:dict(binary(), gleam@dynamic:dynamic_())} | {error, pontil_context_error()}. get_object(Raw, Key) -> decode_field(Raw, Key, <<"an object"/utf8>>, raw_decoder()). -file("src/pontil/context.gleam", 1142). ?DOC(" Get a `Dynamic` list from a `RawObject` by key.\n"). -spec get_list(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary()) -> {ok, list(gleam@dynamic:dynamic_())} | {error, pontil_context_error()}. get_list(Raw, Key) -> decode_field( Raw, Key, <<"a list"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_dynamic/1} ) ). -file("src/pontil/context.gleam", 1155). ?DOC(" Get a list of strings from a `RawObject` by key.\n"). -spec get_string_list( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary() ) -> {ok, list(binary())} | {error, pontil_context_error()}. get_string_list(Raw, Key) -> decode_field( Raw, Key, <<"a string list"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ) ). -file("src/pontil/context.gleam", 1168). ?DOC(" Get a list of objects from a `RawObject` by key.\n"). -spec get_object_list( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), binary() ) -> {ok, list(gleam@dict:dict(binary(), gleam@dynamic:dynamic_()))} | {error, pontil_context_error()}. get_object_list(Raw, Key) -> decode_field( Raw, Key, <<"an object list"/utf8>>, gleam@dynamic@decode:list(raw_decoder()) ). -file("src/pontil/context.gleam", 1226). -spec decode_at( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), list(binary()), binary(), gleam@dynamic@decode:decoder(ECT) ) -> {ok, ECT} | {error, pontil_context_error()}. decode_at(Raw, Path, Expected, Decoder) -> case Path of [] -> {error, {raw_object_key_missing, <<""/utf8>>}}; [Key] -> decode_field(Raw, Key, Expected, Decoder); [Key@1 | Rest] -> case decode_field(Raw, Key@1, <<"an object"/utf8>>, raw_decoder()) of {ok, Nested} -> decode_at(Nested, Rest, Expected, Decoder); {error, E} -> {error, E} end end. -file("src/pontil/context.gleam", 1181). ?DOC(" Get a string value at `path` within a `RawObject`.\n"). -spec get_string_at( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), list(binary()) ) -> {ok, binary()} | {error, pontil_context_error()}. get_string_at(Raw, Path) -> decode_at( Raw, Path, <<"a string"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1} ). -file("src/pontil/context.gleam", 1189). ?DOC(" Get an int value at `path` within a `RawObject`.\n"). -spec get_int_at( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), list(binary()) ) -> {ok, integer()} | {error, pontil_context_error()}. get_int_at(Raw, Path) -> decode_at( Raw, Path, <<"an int"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1} ). -file("src/pontil/context.gleam", 1197). ?DOC(" Get a bool value at `path` within a `RawObject`.\n"). -spec get_bool_at( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), list(binary()) ) -> {ok, boolean()} | {error, pontil_context_error()}. get_bool_at(Raw, Path) -> decode_at( Raw, Path, <<"a bool"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1} ). -file("src/pontil/context.gleam", 1205). ?DOC(" Get a nested object at `path` within a `RawObject`.\n"). -spec get_object_at( gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), list(binary()) ) -> {ok, gleam@dict:dict(binary(), gleam@dynamic:dynamic_())} | {error, pontil_context_error()}. get_object_at(Raw, Path) -> decode_at(Raw, Path, <<"an object"/utf8>>, raw_decoder()).