diff --git a/lib/DB.rakumod b/lib/DB.rakumod index acec709..fab8ae1 100644 --- a/lib/DB.rakumod +++ b/lib/DB.rakumod @@ -6,61 +6,8 @@ unit module DB; use Pandoc; use JSON::Class:auth; -#| Top level metadata for the blog -class BlogMeta is json(:pretty) { - #| The title of the blog - has Str:D $.title is required; - #| The tagline of the blog - has Str:D $.tagline is required; -} - -#| Shared post meta-data -role Post is json { - #| The location of the source file for the post - has - IO::Path:D $.source - is required - is json( - :to-json(*.Str), - :from-json(*.IO) - ); - #| The time to display for the creation of the post - has - DateTime:D $.posted-at - is required - is json( - :to-json(*.Str), - :from-json(*.DateTime) - ); - #| An optional list of edit times for the post - has - DateTime:D @.edited-at - is json( - :to-json( - value => { $^value.Str } - ), - :from-json( - value => { $^value.DateTime } - ) - ) - = []; - #| An optional list of extra slugs to use for this post - has Str:D @.slugs is json = []; - #| Should the post be hidden from the main list - has Bool:D $.hidden is json is rw = False; - - #| Get the title for this post, intended to be extracted from whatever - #| document produced it - method title(--> Str:D) {...} - - #| Get the list of slugs for this post, including ones auto generated from - #| the title, as well as any additional slugs - method all-slugs(--> Array[Str:D]) { - my $long-title-slug = self.title.lc.subst: /\h*/, '-'; - return [$long-title-slug, @!slugs].flat.Array; - } - -} +use DB::Post; +use DB::BlogMeta; #| A plain markdown post class MarkdownPost does Post is json { diff --git a/lib/DB/Post.rakumod b/lib/DB/Post.rakumod new file mode 100644 index 0000000..afead15 --- /dev/null +++ b/lib/DB/Post.rakumod @@ -0,0 +1,50 @@ +use v6.e.PREVIEW; + +use JSON::Class:auth; + +#| Shared post meta-data +unit role Post is json; + +#| The location of the source file for the post +has +IO::Path:D $.source + is required + is json( + :to-json(*.Str), + :from-json(*.IO) +); +#| The time to display for the creation of the post +has +DateTime:D $.posted-at + is required + is json( + :to-json(*.Str), + :from-json(*.DateTime) +); +#| An optional list of edit times for the post +has +DateTime:D @.edited-at + is json( + :to-json( + value => { $^value.Str } + ), + :from-json( + value => { $^value.DateTime } + ) +) += []; +#| An optional list of extra slugs to use for this post +has Str:D @.slugs is json = []; +#| Should the post be hidden from the main list +has Bool:D $.hidden is json is rw = False; + +#| Get the title for this post, intended to be extracted from whatever +#| document produced it +method title(--> Str:D) {...} + +#| Get the list of slugs for this post, including ones auto generated from +#| the title, as well as any additional slugs +method all-slugs(--> Array[Str:D]) { + my $long-title-slug = self.title.lc.subst: /\h*/, '-'; + return [$long-title-slug, @!slugs].flat.Array; +}