encoding/openapi: add support for deprecated field from protobuf

protos may be marked as `deprecated=true` in their definitions,
these fields can be mapped to openapi field `deprecated`.

Change-Id: I41204b1cd7e32e2822145622c6dfeab5d8184d65
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2900
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/encoding/openapi/build.go b/encoding/openapi/build.go
index 6a32f5d..8d690d1 100644
--- a/encoding/openapi/build.go
+++ b/encoding/openapi/build.go
@@ -212,6 +212,7 @@
 
 	b.setValueType(v)
 	b.format = extractFormat(v)
+	b.deprecated = getDeprecated(v)
 
 	if b.core == nil || len(b.core.values) > 1 {
 		isRef := b.value(v, nil)
@@ -952,6 +953,7 @@
 	singleFields *oaSchema
 	current      *oaSchema
 	allOf        []*oaSchema
+	deprecated   bool
 
 	// Building structural schema
 	core       *builder
@@ -1072,6 +1074,9 @@
 		b.singleFields.kvs = append(b.singleFields.kvs, t.kvs...)
 		t = b.singleFields
 	}
+	if b.deprecated {
+		t.Set("deprecated", true)
+	}
 	setType(t, b)
 	sortSchema(t)
 	return t
diff --git a/encoding/openapi/testdata/simple-filter.json b/encoding/openapi/testdata/simple-filter.json
index 0acf4a4..76b3d29 100644
--- a/encoding/openapi/testdata/simple-filter.json
+++ b/encoding/openapi/testdata/simple-filter.json
@@ -12,7 +12,8 @@
                "mediumNum",
                "smallNum",
                "float",
-               "double"
+               "double",
+               "deprecatedField"
             ],
             "properties": {
                "mediumNum": {
@@ -29,6 +30,11 @@
                "double": {
                   "type": "number",
                   "format": "double"
+               },
+               "deprecatedField": {
+                  "type": "string",
+                  "format": "string",
+                  "deprecated": true
                }
             }
          }
diff --git a/encoding/openapi/testdata/simple.cue b/encoding/openapi/testdata/simple.cue
index 0504d4c..003be57 100644
--- a/encoding/openapi/testdata/simple.cue
+++ b/encoding/openapi/testdata/simple.cue
@@ -4,4 +4,6 @@
 
 	float:  float32
 	double: float64
+
+	deprecatedField: string @protobuf(5,deprecated)
 }
diff --git a/encoding/openapi/testdata/simple.json b/encoding/openapi/testdata/simple.json
index 8ccb0f3..c2e88d3 100644
--- a/encoding/openapi/testdata/simple.json
+++ b/encoding/openapi/testdata/simple.json
@@ -12,7 +12,8 @@
                "mediumNum",
                "smallNum",
                "float",
-               "double"
+               "double",
+               "deprecatedField"
             ],
             "properties": {
                "mediumNum": {
@@ -31,6 +32,11 @@
                "double": {
                   "type": "number",
                   "format": "double"
+               },
+               "deprecatedField": {
+                  "type": "string",
+                  "format": "string",
+                  "deprecated": true
                }
             }
          }
diff --git a/encoding/openapi/types.go b/encoding/openapi/types.go
index d46fd2b..209dda6 100644
--- a/encoding/openapi/types.go
+++ b/encoding/openapi/types.go
@@ -62,6 +62,13 @@
 	return cueToOpenAPI[s]
 }
 
+func getDeprecated(v cue.Value) bool {
+	// only looking at protobuf attribute for now.
+	a := v.Attribute("protobuf")
+	r, _ := a.Flag(1, "deprecated")
+	return r
+}
+
 func simplify(b *builder, t *OrderedMap) {
 	if b.format == "" {
 		return