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

gram:op

> ./lib/issue.ex

Lenses
(coming soon!)


defmodule Issue do
  defmodule NotFoundError, do: defexception [:message, plug_status: 404]
  @issues_query "priv/issue/*.md"

  def query_issues do query_issues(true) end
  def query_issues(require_public) do
    Application.app_dir(:op, @issues_query)
    |> Path.wildcard
    |> Enum.map(&parse/1)
    |> Enum.sort_by(&hd/1)
    |> Enum.reverse
    |> Enum.map(&Op.Issue.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 issue_by_key!(key) do
    Enum.find(query_issues(), &(&1.key == key)) ||
      raise NotFoundError, "no issue uses key `#{key}`."
  end

  def issues_by_label!(label) do
    case Enum.filter(query_issues(), &(label in &1.labels)) do
      [] -> raise NotFoundError, "No issues are labeled `#{label}`."
      issues -> issues
    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