Skip to main content

src/fishgirl.erl

-module(fishgirl).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/fishgirl.gleam").
-export([element/1, register/0, from/1]).
-export_type([model/0, message/0]).

-type model() :: {model, binary(), {ok, binary()} | {error, binary()}, binary()}.

-type message() :: {parent_changed_value, binary()} |
    {mermaid_render_finish, {ok, binary()} | {error, binary()}}.

-file("src/fishgirl.gleam", 26).
-spec element(list(lustre@vdom@vattr:attribute(PGU))) -> lustre@vdom@vnode:element(PGU).
element(Attributes) ->
    lustre@element:element(<<"fishgirl-diagram"/utf8>>, Attributes, []).

-file("src/fishgirl.gleam", 83).
-spec view(model()) -> lustre@vdom@vnode:element(message()).
view(Model) ->
    gleam@bool:guard(
        erlang:element(2, Model) =:= <<""/utf8>>,
        lustre@element@html:'div'(
            [lustre@attribute:id(erlang:element(4, Model))],
            [lustre@element:text(<<"No Mermaid code to parse from."/utf8>>)]
        ),
        fun() ->
            gleam@bool:guard(
                erlang:element(3, Model) =:= {ok, <<""/utf8>>},
                lustre@element:text(<<"Rendering..."/utf8>>),
                fun() -> case erlang:element(3, Model) of
                        {ok, Svg} ->
                            lustre@element:unsafe_raw_html(
                                <<""/utf8>>,
                                <<"figure"/utf8>>,
                                [lustre@attribute:id(erlang:element(4, Model))],
                                Svg
                            );

                        {error, Errmsg} ->
                            lustre@element@html:'div'(
                                [lustre@attribute:id(erlang:element(4, Model))],
                                [lustre@element@html:p(
                                        [],
                                        [lustre@element:text(
                                                <<"An error occured parsing this diagram:"/utf8>>
                                            )]
                                    ),
                                    lustre@element@html:pre(
                                        [],
                                        [lustre@element:text(Errmsg)]
                                    )]
                            )
                    end end
            )
        end
    ).

-file("src/fishgirl.gleam", 126).
-spec ts_render_mermaid(binary(), binary()) -> gleam@javascript@promise:promise({ok,
        binary()} |
    {error, binary()}).
ts_render_mermaid(_, _) ->
    erlang:error(#{gleam_error => panic,
            message => <<"Rendering only works on the JS target."/utf8>>,
            file => <<?FILEPATH/utf8>>,
            module => <<"fishgirl"/utf8>>,
            function => <<"ts_render_mermaid"/utf8>>,
            line => 130}).

-file("src/fishgirl.gleam", 60).
-spec update(model(), message()) -> {model(), lustre@effect:effect(message())}.
update(Model, Message) ->
    case Message of
        {parent_changed_value, Value} ->
            {{model,
                    Value,
                    begin
                        _pipe = <<""/utf8>>,
                        {ok, _pipe}
                    end,
                    erlang:element(4, Model)},
                stdlib:'Nil'(Value, erlang:element(4, Model))};

        {mermaid_render_finish, New_svg} ->
            {{model,
                    erlang:element(2, Model),
                    New_svg,
                    erlang:element(4, Model)},
                lustre@effect:none()}
    end.

-file("src/fishgirl.gleam", 134).
-spec ts_init_mermaid() -> nil.
ts_init_mermaid() ->
    nil.

-file("src/fishgirl.gleam", 46).
-spec init(any()) -> {model(), lustre@effect:effect(message())}.
init(_) ->
    nil = ts_init_mermaid(),
    Random_id = <<"fishgirl-mermaid-"/utf8,
        (begin
            _pipe = gleam@int:random(10000000),
            erlang:integer_to_binary(_pipe)
        end)/binary>>,
    {{model, <<""/utf8>>, {ok, <<""/utf8>>}, Random_id}, lustre@effect:none()}.

-file("src/fishgirl.gleam", 15).
-spec register() -> {ok, nil} | {error, lustre:error()}.
register() ->
    Component = lustre:component(
        fun init/1,
        fun update/2,
        fun view/1,
        [lustre@component:on_attribute_change(
                <<"value"/utf8>>,
                fun(Value) -> {ok, {parent_changed_value, Value}} end
            )]
    ),
    lustre:register(Component, <<"fishgirl-diagram"/utf8>>).

-file("src/fishgirl.gleam", 32).
-spec from(binary()) -> lustre@vdom@vattr:attribute(any()).
from(Value) ->
    lustre@attribute:value(Value).