| Total Lines | 80 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
| 1 | package schema |
||
| 2 | |||
| 3 | import ( |
||
| 4 | "io" |
||
| 5 | "net/http" |
||
| 6 | "os" |
||
| 7 | "strings" |
||
| 8 | ) |
||
| 9 | |||
| 10 | type SchemaType int |
||
| 11 | |||
| 12 | const ( |
||
| 13 | URL SchemaType = iota |
||
| 14 | File |
||
| 15 | Inline |
||
| 16 | ) |
||
| 17 | |||
| 18 | type SchemaLoader struct { |
||
| 19 | loaders map[SchemaType]func(string) (string, error) |
||
| 20 | } |
||
| 21 | |||
| 22 | func NewSchemaLoader() *SchemaLoader { |
||
| 23 | return &SchemaLoader{ |
||
| 24 | loaders: map[SchemaType]func(string) (string, error){ |
||
| 25 | URL: loadFromURL, |
||
| 26 | File: loadFromFile, |
||
| 27 | Inline: loadInline, |
||
| 28 | }, |
||
| 29 | } |
||
| 30 | } |
||
| 31 | |||
| 32 | func (s *SchemaLoader) LoadSchema(input string) (string, error) { |
||
| 33 | return s.loaders[determineSchemaType(input)](input) |
||
| 34 | } |
||
| 35 | |||
| 36 | func determineSchemaType(input string) SchemaType { |
||
| 37 | if isURL(input) { |
||
| 38 | return URL |
||
| 39 | } else if isFilePath(input) { |
||
| 40 | return File |
||
| 41 | } else { |
||
| 42 | return Inline |
||
| 43 | } |
||
| 44 | } |
||
| 45 | |||
| 46 | func isURL(input string) bool { |
||
| 47 | return strings.HasPrefix(input, "http://") || strings.HasPrefix(input, "https://") |
||
| 48 | } |
||
| 49 | |||
| 50 | func isFilePath(input string) bool { |
||
| 51 | _, err := os.Stat(input) |
||
| 52 | return err == nil |
||
| 53 | } |
||
| 54 | |||
| 55 | func loadFromURL(url string) (string, error) { |
||
| 56 | resp, err := http.Get(url) |
||
| 57 | if err != nil { |
||
| 58 | return "", err |
||
| 59 | } |
||
| 60 | defer resp.Body.Close() |
||
| 61 | |||
| 62 | body, err := io.ReadAll(resp.Body) |
||
| 63 | if err != nil { |
||
| 64 | return "", err |
||
| 65 | } |
||
| 66 | |||
| 67 | return string(body), nil |
||
| 68 | } |
||
| 69 | |||
| 70 | func loadFromFile(path string) (string, error) { |
||
| 71 | content, err := os.ReadFile(path) |
||
| 72 | if err != nil { |
||
| 73 | return "", err |
||
| 74 | } |
||
| 75 | |||
| 76 | return string(content), nil |
||
| 77 | } |
||
| 78 | |||
| 79 | func loadInline(schema string) (string, error) { |
||
| 80 | return schema, nil |
||
| 81 | } |
||
| 82 |