lib/aliyun_oss/client/error.ex

defmodule Aliyun.Oss.Client.Error do
  defstruct [:status_code, :body, :parsed_details]

  def parse(error = %__MODULE__{body: body}) do
    %__MODULE__{error | parsed_details: parse_error_xml(body)}
  end

  def parse(body, status_code) do
    parse(%__MODULE__{status_code: status_code, body: body})
  end

  defp parse_error_xml(xml) do
    try do
      xml
      |> XmlToMap.naive_map()
      |> Map.fetch!("Error")
    catch
      {:error, _} -> nil
    end
  end
end