@@ -72,21 +72,6 @@ defmodule ReleaseKit.Manifest do
7272 }
7373 end
7474
75- @ doc """
76- Converts a manifest struct to the stable external map stored in ETF files.
77- """
78- @ spec to_external_map ( t ( ) ) :: map ( )
79- def to_external_map ( % __MODULE__ { } = manifest ) do
80- manifest
81- |> Map . from_struct ( )
82- |> Map . update! ( :artifact , & external_artifact / 1 )
83- |> Map . update! ( :target , & external_target / 1 )
84- |> Map . update! ( :build , & external_build / 1 )
85- |> Map . update! ( :assets , & external_assets / 1 )
86- |> Enum . reject ( fn { _key , value } -> is_nil ( value ) or value == [ ] end )
87- |> Map . new ( )
88- end
89-
9075 @ doc """
9176 Writes a manifest as ETF.
9277 """
@@ -96,29 +81,35 @@ defmodule ReleaseKit.Manifest do
9681 |> Path . dirname ( )
9782 |> File . mkdir_p! ( )
9883
99- File . write! ( path , :erlang . term_to_binary ( to_external_map ( manifest ) ) )
84+ File . write! ( path , :erlang . term_to_binary ( manifest ) )
10085 end
10186
102- defp external_artifact ( nil ) , do: nil
103-
104- defp external_artifact ( % ReleaseKit.ArtifactInfo { } = artifact ) ,
105- do: ReleaseKit.ArtifactInfo . to_external_map ( artifact )
106-
107- defp external_target ( nil ) , do: nil
108-
109- defp external_target ( % ReleaseKit.Target { } = target ) ,
110- do: ReleaseKit.Target . to_external_map ( target )
87+ @ doc """
88+ Reads a typed manifest from ETF.
89+ """
90+ @ spec read! ( Path . t ( ) ) :: t ( )
91+ def read! ( path ) when is_binary ( path ) do
92+ path
93+ |> File . read! ( )
94+ |> :erlang . binary_to_term ( )
95+ |> validate! ( )
96+ end
11197
112- defp external_build ( nil ) , do: nil
98+ @ doc """
99+ Validates a typed manifest contract.
100+ """
101+ @ spec validate! ( term ( ) ) :: t ( )
102+ def validate! ( % __MODULE__ { format: :beam_release_artifact , format_version: 2 } = manifest ) do
103+ manifest
104+ end
113105
114- defp external_build ( % ReleaseKit.BuildInfo { } = build ) ,
115- do: ReleaseKit.BuildInfo . to_external_map ( build )
106+ def validate! ( % __MODULE__ { } = manifest ) do
107+ raise ArgumentError ,
108+ "unsupported ReleaseKit manifest #{ inspect ( manifest . format ) } v#{ inspect ( manifest . format_version ) } "
109+ end
116110
117- defp external_assets ( assets ) do
118- Enum . map ( assets , fn
119- % ReleaseKit.AssetInfo { } = asset -> ReleaseKit.AssetInfo . to_external_map ( asset )
120- asset -> asset
121- end )
111+ def validate! ( other ) do
112+ raise ArgumentError , "expected %ReleaseKit.Manifest{}, got: #{ inspect ( other ) } "
122113 end
123114
124115 defp env ( opts ) do
0 commit comments