aboutsummaryrefslogtreecommitdiffstats
path: root/lib/lkn/core/specs/helper.ex
blob: 933f60c4b6d96441c5000e4db8bc6c64758671db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
defmodule TypedElement do
  @moduledoc false

  defstruct [
    :e,
    :t,
  ]

  def parse({:::, _, [elem, type]}) do
    %TypedElement{
      e: elem,
      t: type
    }
  end
end

defmodule Arg do
  @moduledoc false

  defstruct [
    :name,
    :type,
  ]

  def parse(line) do
    te = TypedElement.parse(line)
    %Arg{
      name: te.e,
      type: te.t,
    }
  end
end

defmodule Func do
  @moduledoc false

  defstruct [
    :name,
    :arguments,
  ]

  def parse({funcname, _, arglist}) do
    %Func{
      name: funcname,
      arguments: Enum.map(arglist, &(Arg.parse(&1))),
    }
  end
end

defmodule Cast do
  @moduledoc false

  defstruct [
    :doc,
    :fun,
  ]

  def parse(fun) do
    %Cast{
      doc: :none,
      fun: Func.parse(fun),
    }
  end
end

defmodule Call do
  @moduledoc false

  defstruct [
    :doc,
    :fun,
    :ret,
  ]

  def parse(fun) do
    te = TypedElement.parse(fun)
    %Call{
        doc: :none,
        fun: Func.parse(te.e),
        ret: te.t
     }
  end
end