-module(og_image). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/og_image.gleam"). -export([defaults/0, render/2]). -export_type([format/0, font_style/0, font/0, render_error/0, config/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. -type format() :: png | {jpeg, integer()} | {web_p, integer()}. -type font_style() :: normal | italic. -type font() :: {font, binary(), binary(), integer(), font_style()}. -type render_error() :: {invalid_element, binary()} | {font_load_error, binary()} | {image_load_error, binary()} | {render_failed, binary()}. -type config() :: {config, integer(), integer(), format(), list(font())}. -file("src/og_image.gleam", 48). ?DOC(" Default config: 1200x630 PNG, no custom fonts\n"). -spec defaults() -> config(). defaults() -> {config, 1200, 630, png, []}. -file("src/og_image.gleam", 58). ?DOC(" Render a Lustre element to an image (Erlang target)\n"). -spec render(lustre@vdom@vnode:element(any()), config()) -> {ok, bitstring()} | {error, render_error()}. render(El, Config) -> Urls = og_image@transform:collect_image_urls(El), Resources = og_image@fetch:fetch_all(Urls), Json_str = begin _pipe = El, _pipe@1 = og_image@transform:to_takumi_json_with_root(_pipe), gleam@json:to_string(_pipe@1) end, {Format_str, Quality} = case erlang:element(4, Config) of png -> {<<"png"/utf8>>, -1}; {jpeg, Q} -> {<<"jpeg"/utf8>>, Q}; {web_p, Q@1} -> {<<"webp"/utf8>>, Q@1} end, _pipe@2 = og_image_native:render_image( Json_str, erlang:element(2, Config), erlang:element(3, Config), Format_str, Quality, Resources ), gleam@result:map_error( _pipe@2, fun(Field@0) -> {render_failed, Field@0} end ).