defmodule Azure.Storage.BlobPolicy do @moduledoc """ BlobPolicy """ import SweetXml import Azure.Storage.DateTimeUtils import Azure.Storage.Utilities, only: [set_to_string: 2, string_to_set: 2] require EEx defstruct [:id, :start, :expiry, :permission] @perms %{read: "r", write: "w", delete: "d", list: "l"} def permission_serialize(permissions) when is_list(permissions), do: permissions |> set_to_string(@perms) def permission_parse(str) when is_binary(str), do: str |> string_to_set(@perms) def deserialize(xml_body) do xml_body |> xpath(~x"/SignedIdentifiers/SignedIdentifier"l) |> Enum.map(fn node -> %__MODULE__{ id: node |> xpath(~x"./Id/text()"s), start: node |> xpath(~x"./AccessPolicy/Start/text()"s |> transform_by(&date_parse_iso8601/1)), expiry: node |> xpath(~x"./AccessPolicy/Expiry/text()"s |> transform_by(&date_parse_iso8601/1)), permission: node |> xpath(~x"./AccessPolicy/Permission/text()"s |> transform_by(&permission_parse/1)) } end) end @template """ <%= for policy <- @policies do %> <%= policy.id %> <%= policy.start |> Azure.Storage.DateTimeUtils.to_string_iso8601() %> <%= policy.expiry |> Azure.Storage.DateTimeUtils.to_string_iso8601() %> <%= policy.permission |> Azure.Storage.BlobPolicy.permission_serialize() %> Date <% end %> """ def serialize(policies) when is_list(policies), do: @template |> EEx.eval_string(assigns: [policies: policies]) |> Kernel.to_string() # def serialize(policies) when is_list(policies) do # inner_xml = # policies # |> Enum.map(&serialize/1) # |> Enum.join("") # # bom = "\uFEFF" # # bom <> # "" <> # "#{inner_xml}" # end # # def serialize(policy = %__MODULE__{}) when is_map(policy), # do: # "" <> # "#{policy.id}" <> # "" <> # "#{policy.start |> DateTimeUtils.to_string_iso8601()}" <> # "#{policy.expiry |> DateTimeUtils.to_string_iso8601()}" <> # "#{policy.permission |> permission_serialize()}" <> # "" <> "" end