Current section
Files
Jump to
Current section
Files
src/starfeeds@json_feed.erl
-module(starfeeds@json_feed).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/starfeeds/json_feed.gleam").
-export([render_json/1]).
-export_type([json_feed/0, json_item/0]).
-opaque json_feed() :: {json_feed,
binary(),
binary(),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
list(starfeeds@types:author()),
gleam@option:option(binary()),
gleam@option:option(boolean()),
list(json_item()),
gleam@dict:dict(binary(), starfeeds@types:extension_objects())}.
-opaque json_item() :: {json_item,
binary(),
gleam@option:option(binary()),
binary(),
birl:time(),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(starfeeds@types:enclosure()),
gleam@option:option(starfeeds@types:author()),
list(binary()),
binary(),
binary(),
gleam@option:option(binary()),
list(gleam@dict:dict(binary(), starfeeds@types:extension_objects()))}.
-file("src/starfeeds/json_feed.gleam", 110).
-spec json_item_to_json(json_item()) -> gleam@json:json().
json_item_to_json(Json_item) ->
{json_item,
Title,
Id,
Url,
Date,
Summary,
Content_html,
Category,
Image,
Enclosure,
Author,
Tags,
Date_published,
Date_modified,
Copyright,
Extensions} = Json_item,
gleam@json:object(
[{<<"title"/utf8>>, gleam@json:string(Title)},
{<<"id"/utf8>>, case Id of
none ->
gleam@json:null();
{some, Value} ->
gleam@json:string(Value)
end},
{<<"url"/utf8>>, gleam@json:string(Url)},
{<<"date"/utf8>>,
gleam@json:string(
begin
_pipe = Date,
birl:to_iso8601(_pipe)
end
)},
{<<"summary"/utf8>>, case Summary of
none ->
gleam@json:null();
{some, Value@1} ->
gleam@json:string(Value@1)
end},
{<<"content_html"/utf8>>, case Content_html of
none ->
gleam@json:null();
{some, Value@2} ->
gleam@json:string(Value@2)
end},
{<<"category"/utf8>>, case Category of
none ->
gleam@json:null();
{some, Value@3} ->
gleam@json:string(Value@3)
end},
{<<"image"/utf8>>, case Image of
none ->
gleam@json:null();
{some, Value@4} ->
gleam@json:string(Value@4)
end},
{<<"enclosure"/utf8>>, case Enclosure of
none ->
gleam@json:null();
{some, Value@5} ->
starfeeds@types:enclosure_to_json(Value@5)
end},
{<<"author"/utf8>>, case Author of
none ->
gleam@json:null();
{some, Value@6} ->
starfeeds@types:author_to_json(Value@6)
end},
{<<"tags"/utf8>>, gleam@json:array(Tags, fun gleam@json:string/1)},
{<<"date_published"/utf8>>, gleam@json:string(Date_published)},
{<<"date_modified"/utf8>>, gleam@json:string(Date_modified)},
{<<"copyright"/utf8>>, case Copyright of
none ->
gleam@json:null();
{some, Value@7} ->
gleam@json:string(Value@7)
end},
{<<"extensions"/utf8>>,
gleam@json:array(
Extensions,
fun starfeeds@types:extensionobject_to_json/1
)}]
).
-file("src/starfeeds/json_feed.gleam", 28).
-spec json_feed_to_json(json_feed()) -> gleam@json:json().
json_feed_to_json(Json_feed) ->
{json_feed,
Version,
Title,
Home_page_url,
Feed_url,
Description,
User_comment,
Next_url,
Icon,
Favicon,
Authors,
Language,
Expired,
Items,
Extensions} = Json_feed,
gleam@json:object(
[{<<"version"/utf8>>, gleam@json:string(Version)},
{<<"title"/utf8>>, gleam@json:string(Title)},
{<<"home_page_url"/utf8>>, case Home_page_url of
none ->
gleam@json:null();
{some, Value} ->
gleam@json:string(Value)
end},
{<<"feed_url"/utf8>>, case Feed_url of
none ->
gleam@json:null();
{some, Value@1} ->
gleam@json:string(Value@1)
end},
{<<"description"/utf8>>, case Description of
none ->
gleam@json:null();
{some, Value@2} ->
gleam@json:string(Value@2)
end},
{<<"user_comment"/utf8>>, case User_comment of
none ->
gleam@json:null();
{some, Value@3} ->
gleam@json:string(Value@3)
end},
{<<"next_url"/utf8>>, case Next_url of
none ->
gleam@json:null();
{some, Value@4} ->
gleam@json:string(Value@4)
end},
{<<"icon"/utf8>>, case Icon of
none ->
gleam@json:null();
{some, Value@5} ->
gleam@json:string(Value@5)
end},
{<<"favicon"/utf8>>, case Favicon of
none ->
gleam@json:null();
{some, Value@6} ->
gleam@json:string(Value@6)
end},
{<<"authors"/utf8>>,
gleam@json:array(Authors, fun starfeeds@types:author_to_json/1)},
{<<"language"/utf8>>, case Language of
none ->
gleam@json:null();
{some, Value@7} ->
gleam@json:string(Value@7)
end},
{<<"expired"/utf8>>, case Expired of
none ->
gleam@json:null();
{some, Value@8} ->
gleam@json:bool(Value@8)
end},
{<<"items"/utf8>>, gleam@json:array(Items, fun json_item_to_json/1)},
{<<"extensions"/utf8>>,
starfeeds@types:extensionobject_to_json(Extensions)}]
).
-file("src/starfeeds/json_feed.gleam", 171).
-spec feed(starfeeds@types:feed_options()) -> json_feed().
feed(Options) ->
{json_feed,
<<"https://jsonfeed.org/version/1.1"/utf8>>,
erlang:element(3, Options),
erlang:element(15, Options),
none,
none,
none,
none,
none,
none,
[],
none,
none,
[],
maps:new()}.
-file("src/starfeeds/json_feed.gleam", 190).
-spec feed_item() -> json_item().
feed_item() ->
{json_item,
<<""/utf8>>,
none,
<<""/utf8>>,
birl:now(),
none,
none,
none,
none,
none,
none,
[],
<<""/utf8>>,
<<""/utf8>>,
none,
[]}.
-file("src/starfeeds/json_feed.gleam", 210).
-spec render_json(starfeeds@types:feed()) -> gleam@json:json().
render_json(Ins) ->
Base_feed = feed(erlang:element(2, Ins)),
Feed_with_options = case erlang:element(2, Ins) of
{feed_options,
_,
_,
_,
_,
_,
_,
_,
{some, Links},
_,
_,
_,
_,
_,
_,
_,
_,
_,
_} ->
case erlang:element(4, Links) of
<<"Json"/utf8>> ->
_record = Base_feed,
{json_feed,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
{some, erlang:element(2, Links)},
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record),
erlang:element(12, _record),
erlang:element(13, _record),
erlang:element(14, _record),
erlang:element(15, _record)};
<<"json"/utf8>> ->
_record = Base_feed,
{json_feed,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
{some, erlang:element(2, Links)},
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record),
erlang:element(12, _record),
erlang:element(13, _record),
erlang:element(14, _record),
erlang:element(15, _record)};
_ ->
Base_feed
end;
_ ->
Base_feed
end,
Authors = case erlang:element(14, erlang:element(2, Ins)) of
{some, Author} ->
[Author];
none ->
[]
end,
Feed_with_rem_opts = begin
_record@1 = Feed_with_options,
{json_feed,
erlang:element(2, _record@1),
erlang:element(3, _record@1),
erlang:element(15, erlang:element(2, Ins)),
erlang:element(5, _record@1),
erlang:element(16, erlang:element(2, Ins)),
erlang:element(7, _record@1),
erlang:element(8, _record@1),
erlang:element(17, erlang:element(2, Ins)),
erlang:element(10, _record@1),
Authors,
erlang:element(6, erlang:element(2, Ins)),
erlang:element(13, _record@1),
erlang:element(14, _record@1),
erlang:element(15, _record@1)}
end,
Feed_with_extensions = begin
_record@2 = Feed_with_rem_opts,
{json_feed,
erlang:element(2, _record@2),
erlang:element(3, _record@2),
erlang:element(4, _record@2),
erlang:element(5, _record@2),
erlang:element(6, _record@2),
erlang:element(7, _record@2),
erlang:element(8, _record@2),
erlang:element(9, _record@2),
erlang:element(10, _record@2),
erlang:element(11, _record@2),
erlang:element(12, _record@2),
erlang:element(13, _record@2),
erlang:element(14, _record@2),
begin
_pipe = erlang:element(6, Ins),
_pipe@1 = gleam@list:map(
_pipe,
fun(E) -> {erlang:element(2, E), erlang:element(3, E)} end
),
maps:from_list(_pipe@1)
end}
end,
Feed_item = feed_item(),
Final_items = begin
_pipe@2 = erlang:element(3, Ins),
gleam@list:map(
_pipe@2,
fun(Item) ->
Tags = begin
_pipe@3 = erlang:element(8, Item),
_pipe@4 = gleam@option:unwrap(_pipe@3, []),
gleam@list:filter_map(
_pipe@4,
fun(Cat) ->
{ok,
begin
_pipe@5 = erlang:element(2, Cat),
gleam@option:unwrap(_pipe@5, <<""/utf8>>)
end}
end
)
end,
Extensions = begin
_pipe@6 = erlang:element(18, Item),
_pipe@8 = gleam@list:filter_map(
_pipe@6,
fun(Ext) ->
{ok,
begin
_pipe@7 = Ext,
gleam@option:unwrap(
_pipe@7,
starfeeds@feed:extension()
)
end}
end
),
gleam@list:map(
_pipe@8,
fun(Ext@1) ->
maps:from_list(
[{erlang:element(2, Ext@1),
erlang:element(3, Ext@1)}]
)
end
)
end,
Item_with_data = begin
_record@3 = Feed_item,
{json_item,
erlang:element(2, Item),
erlang:element(3, Item),
erlang:element(4, Item),
erlang:element(5, _record@3),
erlang:element(6, Item),
erlang:element(7, Item),
erlang:element(8, _record@3),
erlang:element(10, Item),
erlang:element(13, Item),
erlang:element(11, _record@3),
Tags,
begin
_pipe@9 = erlang:element(16, Item),
_pipe@10 = gleam@option:unwrap(_pipe@9, birl:now()),
birl:to_iso8601(_pipe@10)
end,
begin
_pipe@11 = erlang:element(5, Item),
birl:to_iso8601(_pipe@11)
end,
erlang:element(15, _record@3),
Extensions}
end,
case begin
_pipe@12 = erlang:element(14, Item),
_pipe@13 = gleam@option:unwrap(_pipe@12, []),
gleam@list:first(_pipe@13)
end of
{ok, Author@1} ->
_record@4 = Item_with_data,
{json_item,
erlang:element(2, _record@4),
erlang:element(3, _record@4),
erlang:element(4, _record@4),
erlang:element(5, _record@4),
erlang:element(6, _record@4),
erlang:element(7, _record@4),
erlang:element(8, _record@4),
erlang:element(9, _record@4),
erlang:element(10, _record@4),
{some, Author@1},
erlang:element(12, _record@4),
erlang:element(13, _record@4),
erlang:element(14, _record@4),
erlang:element(15, _record@4),
erlang:element(16, _record@4)};
{error, _} ->
Item_with_data
end
end
)
end,
Final_feed = begin
_record@5 = Feed_with_extensions,
{json_feed,
erlang:element(2, _record@5),
erlang:element(3, _record@5),
erlang:element(4, _record@5),
erlang:element(5, _record@5),
erlang:element(6, _record@5),
erlang:element(7, _record@5),
erlang:element(8, _record@5),
erlang:element(9, _record@5),
erlang:element(10, _record@5),
erlang:element(11, _record@5),
erlang:element(12, _record@5),
erlang:element(13, _record@5),
Final_items,
erlang:element(15, _record@5)}
end,
json_feed_to_json(Final_feed).