blob: 71c0904bb8c5544264e795ce3dfc2a2520a9b8b4 (
plain) (
blame)
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
|
defmodule ShardURI do
@moduledoc"""
Convert Shard manifests to and from strings.
"""
def from_manifest(m) do
case m do
%SApp.Chat.Manifest{channel: chan} -> "shard:chat:#{chan}"
%SApp.Chat.PrivChat.Manifest{pk_list: pk_list} ->
"shard:privchat:#{pk_list|>Enum.map(&Base.encode16/1)|>Enum.join(",")}"
%SApp.Identity.Manifest{pk: pk} ->
"shard:identity:#{pk|>Base.encode16}"
%SApp.Directory.Manifest{owner: owner, public: true, name: name} ->
"shard:dir:pub:#{owner|>Base.encode16}:#{name}"
%SApp.Directory.Manifest{owner: owner, public: false, name: name} ->
"shard:dir:priv:#{owner|>Base.encode16}:#{name}"
end
end
def to_manifest(p) do
case p do
"shard:chat:" <> chan ->
%SApp.Chat.Manifest{channel: chan}
"shard:privchat:" <> pklist ->
pklist
|> String.split(",")
|> Enum.map(&parse_pk/1)
|> SApp.Chat.PrivChat.Manifest.new()
"shard:identity:" <> pk ->
%SApp.Identity.Manifest{pk: parse_pk pk}
"shard:dir:pub:" <> <<pk::bytes-size(64)>> <> ":" <> name ->
%SApp.Directory.Manifest{owner: parse_pk(pk), public: true, name: name}
"shard:dir:priv:" <> <<pk::bytes-size(64)>> <> ":" <> name ->
%SApp.Directory.Manifest{owner: parse_pk(pk), public: false, name: name}
end
end
def parse_pk(pkstr) do
64 = byte_size pkstr
Base.decode16! pkstr
end
end
|