• Operand
  • # (b)ring mi - belles.

gram:op

> ./lib/press.ex

Lenses
(coming soon!)


defmodule Press do
  defmodule NotFoundError, do: defexception [:message, plug_status: 404]

  @pages_query "priv/page/*.md"
  def label, do: "chronicle"

  def query_pages do query_pages(true) end
  def query_pages(require_public) do
    Application.app_dir(:op, @pages_query)
    |> Path.wildcard
    |> Enum.map(&parse/1)
    |> Enum.sort_by(&hd/1)
    |> Enum.reverse
    |> Enum.map(&Op.Page.read/1)
    |> Enum.filter(& if require_public, do: &1.public, else: true)
    |> Enum.with_index
    |> Enum.map(fn {node, n} -> %{node | sequence: n} end)
  end

  def page_by_key!(key) do
    Enum.find(query_pages(), &(&1.key == key)) ||
      raise NotFoundError, "no page uses key `#{key}`."
  end

  def pages_by_label!(label) do
    case Enum.filter(query_pages(), &(label in &1.labels)) do
      [] -> raise NotFoundError, "No pages are labeled `#{label}`."
      pages -> pages
    end
  end

  def parse(node) do
    [clock, key] = node
    |> Path.rootname
    |> Path.split
    |> List.last
    |> String.split(".", parts: 2)
    [clock, key, node]
  end

  # def parse_clock(phrase) do
  #   case phrase |> IO.inspect |> String.length do
  #     10 -> (phrase)
  #     7 -> (phrase <> "-01")
  #     4 -> (phrase <> "-01-01")
  #   end
  # end
end