handler/swagger: initial import
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
		
							
								
								
									
										55
									
								
								handler/swagger/swagger.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								handler/swagger/swagger.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | package swagger | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"io/fs" | ||||||
|  | 	"net/http" | ||||||
|  |  | ||||||
|  | 	yamlcodec "go.unistack.org/micro-codec-yaml/v3" | ||||||
|  | 	rutil "go.unistack.org/micro/v3/util/reflect" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Handler append to generated swagger data from dst map[string]interface{} | ||||||
|  | var Handler = func(dst map[string]interface{}, fsys fs.FS) http.HandlerFunc { | ||||||
|  | 	c := yamlcodec.NewCodec() | ||||||
|  | 	return func(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 		if r.Method != http.MethodGet { | ||||||
|  | 			w.WriteHeader(http.StatusNotFound) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		path := r.URL.Path | ||||||
|  | 		if len(path) > 1 && path[0] == '/' { | ||||||
|  | 			path = path[1:] | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		buf, err := fs.ReadFile(fsys, path) | ||||||
|  | 		if err != nil { | ||||||
|  | 			w.WriteHeader(http.StatusInternalServerError) | ||||||
|  | 			_, _ = w.Write([]byte(err.Error())) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		var src interface{} | ||||||
|  |  | ||||||
|  | 		if err = c.Unmarshal(buf, src); err != nil { | ||||||
|  | 			w.WriteHeader(http.StatusInternalServerError) | ||||||
|  | 			_, _ = w.Write([]byte(err.Error())) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if err = rutil.Merge(src, dst); err != nil { | ||||||
|  | 			w.WriteHeader(http.StatusInternalServerError) | ||||||
|  | 			_, _ = w.Write([]byte(err.Error())) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if buf, err = c.Marshal(src); err != nil { | ||||||
|  | 			w.WriteHeader(http.StatusInternalServerError) | ||||||
|  | 			_, _ = w.Write([]byte(err.Error())) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		w.WriteHeader(http.StatusOK) | ||||||
|  | 		_, _ = w.Write(buf) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user