/
utils.ex
143 lines (119 loc) · 2.66 KB
/
utils.ex
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
defmodule Absinthe.Utils do
@doc """
Camelize a word, respecting underscore prefixes.
## Examples
With an uppercase first letter:
```
iex> camelize("foo_bar")
"FooBar"
iex> camelize("foo")
"Foo"
iex> camelize("__foo_bar")
"__FooBar"
iex> camelize("__foo")
"__Foo"
iex> camelize("_foo")
"_Foo"
```
With a lowercase first letter:
```
iex> camelize("foo_bar", lower: true)
"fooBar"
iex> camelize("foo", lower: true)
"foo"
iex> camelize("__foo_bar", lower: true)
"__fooBar"
iex> camelize("__foo", lower: true)
"__foo"
iex> camelize("_foo", lower: true)
"_foo"
```
"""
@spec camelize(binary, Keyword.t()) :: binary
def camelize(word, opts \\ [])
def camelize("_" <> word, opts) do
"_" <> camelize(word, opts)
end
def camelize(word, opts) do
case opts |> Enum.into(%{}) do
%{lower: true} ->
{first, rest} = String.split_at(Macro.camelize(word), 1)
String.downcase(first) <> rest
_ ->
Macro.camelize(word)
end
end
@doc false
@spec escapable?(any()) :: boolean()
def escapable?(value) do
# if this doesn't blow up, the value can be escaped
_ = Macro.escape(value)
true
rescue
_ ->
false
end
@doc false
def placement_docs([{_, placement} | _]) do
placement
|> do_placement_docs
end
defp do_placement_docs(toplevel: true) do
"""
Top level in module.
"""
end
defp do_placement_docs(toplevel: false) do
"""
Allowed under any block. Not allowed to be top level
"""
end
defp do_placement_docs(under: under) when is_list(under) do
under =
under
|> Enum.sort_by(& &1)
|> Enum.map(&"`#{&1}`")
|> Enum.join(" ")
"""
Allowed under: #{under}
"""
end
defp do_placement_docs(under: under) do
do_placement_docs(under: [under])
end
@doc false
def describe_builtin_module(module) do
title =
module
|> Module.split()
|> List.last()
types =
module.__absinthe_types__
|> Map.keys()
|> Enum.sort_by(& &1)
|> Enum.map(fn identifier ->
type = module.__absinthe_type__(identifier)
"""
## #{type.name}
Identifier: `#{inspect(identifier)}`
#{type.description}
"""
end)
directives =
module.__absinthe_directives__
|> Map.keys()
|> Enum.sort_by(& &1)
|> Enum.map(fn identifier ->
directive = module.__absinthe_directive__(identifier)
"""
## #{directive.name}
Identifier: `#{inspect(identifier)}`
#{directive.description}
"""
end)
"""
# #{title}
#{types ++ directives}
"""
end
end