Skip to content

Commit 4cc8ec4

Browse files
committed
Merge branch 'release/0.1.6'
2 parents 4a7c578 + d22eb7a commit 4cc8ec4

File tree

4 files changed

+397
-1
lines changed

4 files changed

+397
-1
lines changed

lib/tama_ex/perception.ex

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,27 @@ defmodule TamaEx.Perception do
4646
|> TamaEx.handle_response(Chain)
4747
end
4848
end
49+
50+
alias __MODULE__.Concept
51+
52+
def list_concepts(client, entity_id, options \\ []) do
53+
with {:ok, validated_client} <- TamaEx.validate_client(client, ["perception"]) do
54+
url = "/entities/#{entity_id}/concepts"
55+
56+
query = Keyword.get(options, :query, [])
57+
58+
req_options = [url: url, params: query]
59+
60+
req_options =
61+
if Keyword.has_key?(options, :retry) do
62+
Keyword.put(req_options, :retry, Keyword.get(options, :retry))
63+
else
64+
req_options
65+
end
66+
67+
validated_client
68+
|> Req.get(req_options)
69+
|> TamaEx.handle_response(Concept)
70+
end
71+
end
4972
end

lib/tama_ex/perception/concept.ex

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
defmodule TamaEx.Perception.Concept do
2+
use Ecto.Schema
3+
import Ecto.Changeset
4+
5+
@primary_key false
6+
embedded_schema do
7+
field :id, :binary_id
8+
field :relation, :string
9+
field :content, :map
10+
end
11+
12+
def changeset(concept, attrs) do
13+
concept
14+
|> cast(attrs, [:id, :relation, :content])
15+
|> validate_required([:id, :relation, :content])
16+
end
17+
18+
@doc """
19+
Parses API response data into Concept struct(s).
20+
21+
Handles both individual concept maps and lists of concepts.
22+
"""
23+
def parse(attrs) when is_list(attrs) do
24+
Enum.map(attrs, &parse/1)
25+
end
26+
27+
def parse(attrs) when is_map(attrs) do
28+
%__MODULE__{}
29+
|> changeset(attrs)
30+
|> case do
31+
%Ecto.Changeset{valid?: true} = changeset ->
32+
Ecto.Changeset.apply_changes(changeset)
33+
34+
%Ecto.Changeset{valid?: false} ->
35+
%__MODULE__{}
36+
end
37+
end
38+
39+
def parse(attrs) when is_binary(attrs) do
40+
case Jason.decode(attrs) do
41+
{:ok, decoded} -> parse(decoded)
42+
{:error, _} -> %__MODULE__{}
43+
end
44+
end
45+
46+
def parse(_), do: %__MODULE__{}
47+
48+
@doc """
49+
Parses API response data into a Concept struct, raising on error.
50+
"""
51+
def parse!(attrs) do
52+
%__MODULE__{}
53+
|> changeset(attrs)
54+
|> apply_action!(:insert)
55+
end
56+
end

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule TamaEx.MixProject do
44
def project do
55
[
66
app: :tama_ex,
7-
version: "0.1.5",
7+
version: "0.1.6",
88
elixir: "~> 1.18",
99
start_permanent: Mix.env() == :prod,
1010
deps: deps(),

0 commit comments

Comments
 (0)