Commit 5cbcac4

mo khan <mo@mokhan.ca>
2024-06-05 23:01:10
feat: add YAML parser to serde package
1 parent 9e6f63a
Changed files (3)
pkg/serde/io.go
@@ -5,10 +5,14 @@ import (
 )
 
 func From[T any](r io.Reader, mediaType MediaType) (T, error) {
-	if mediaType == JSONAPI {
+	switch mediaType {
+	case JSONAPI:
 		return FromJSONAPI[T](r)
+	case YAML:
+		return FromYAML[T](r)
+	default:
+		return FromJSON[T](r)
 	}
-	return FromJSON[T](r)
 }
 
 func To[T any](w io.Writer, item T, mediaType MediaType) error {
pkg/serde/io_test.go
@@ -99,6 +99,18 @@ func TestFrom(t *testing.T) {
 		assert.Equal(t, "my-key", results[0].Key)
 		assert.Equal(t, "my-value", results[0].Value)
 	})
+
+	t.Run("parses a single item from YAML data", func(t *testing.T) {
+		body := strings.NewReader(`key: "my-key"
+value: "my-value"
+`)
+
+		result, err := From[Example](body, YAML)
+
+		require.NoError(t, err)
+		assert.Equal(t, "my-key", result.Key)
+		assert.Equal(t, "my-value", result.Value)
+	})
 }
 
 func TestTo(t *testing.T) {
pkg/serde/yaml.go
@@ -9,3 +9,8 @@ import (
 func ToYAML[T any](w io.Writer, item T) error {
 	return yaml.NewEncoder(w).Encode(item)
 }
+
+func FromYAML[T any](reader io.Reader) (T, error) {
+	var item T
+	return item, yaml.NewDecoder(reader).Decode(&item)
+}