1
1
defmodule Record do
2
2
@ doc """
3
- Extract record information from an Erlang file.
3
+ Extracts record information from an Erlang file.
4
4
5
5
Returns the fields as a list of tuples.
6
6
7
7
## Examples
8
8
9
- Record.extract(:file_info, from_lib: "kernel/include/file.hrl")
10
- #=> [size: :undefined, type: :undefined, access: :undefined, atime: :undefined,
11
- mtime: :undefined, ctime: :undefined, mode: :undefined, links: :undefined,
12
- major_device: :undefined, minor_device: :undefined, inode: :undefined,
13
- uid: :undefined, gid: :undefined]
14
-
15
- defrecord FileInfo, Record.extract(:file_info, from_lib: "kernel/include/file.hrl")
9
+ iex> Record.extract(:file_info, from_lib: "kernel/include/file.hrl")
10
+ [size: :undefined, type: :undefined, access: :undefined, atime: :undefined,
11
+ mtime: :undefined, ctime: :undefined, mode: :undefined, links: :undefined,
12
+ major_device: :undefined, minor_device: :undefined, inode: :undefined,
13
+ uid: :undefined, gid: :undefined]
16
14
17
15
"""
18
16
def extract ( name , opts ) do
19
17
Record.Extractor . extract ( name , opts )
20
18
end
21
19
20
+ @ doc """
21
+ Checks if the given `data` is a record of `kind`.
22
+
23
+ This is implemented as a macro so it can be used in guard clauses.
24
+
25
+ ## Examples
26
+
27
+ iex> Record.record?({ User, "jose", 27 }, User)
28
+ true
29
+
30
+ """
31
+ defmacro record? ( data , kind ) do
32
+ case __CALLER__ . in_guard? do
33
+ true ->
34
+ quote do
35
+ is_tuple ( unquote ( data ) ) and tuple_size ( unquote ( data ) ) > 0
36
+ and :erlang . element ( 1 , unquote ( data ) ) == unquote ( kind )
37
+ end
38
+ false ->
39
+ quote do
40
+ result = unquote ( data )
41
+ is_tuple ( result ) and tuple_size ( result ) > 0
42
+ and :erlang . element ( 1 , result ) == unquote ( kind )
43
+ end
44
+ end
45
+ end
46
+
47
+ @ doc """
48
+ Checks if the given `data` is a record.
49
+
50
+ This is implemented as a macro so it can be used in guard clauses.
51
+
52
+ ## Examples
53
+
54
+ iex> Record.record?({ User, "jose", 27 })
55
+ true
56
+ iex> Record.record?(13)
57
+ false
58
+
59
+ """
60
+ defmacro record? ( data ) do
61
+ case __CALLER__ . in_guard? do
62
+ true ->
63
+ quote do
64
+ is_tuple ( unquote ( data ) ) and tuple_size ( unquote ( data ) ) > 0
65
+ and is_atom ( :erlang . element ( 1 , unquote ( data ) ) )
66
+ end
67
+ false ->
68
+ quote do
69
+ result = unquote ( data )
70
+ is_tuple ( result ) and tuple_size ( result ) > 0
71
+ and is_atom ( :erlang . element ( 1 , result ) )
72
+ end
73
+ end
74
+ end
75
+
22
76
@ doc false
23
77
def defmacros ( name , values , env , tag \\ nil ) do
24
78
Record.Deprecated . defmacros ( name , values , env , tag )
@@ -33,4 +87,4 @@ defmodule Record do
33
87
def deffunctions ( values , env ) do
34
88
Record.Deprecated . deffunctions ( values , env )
35
89
end
36
- end
90
+ end
0 commit comments