| 138 | } |
| 139 | } |
| 140 | func ReturnFetchValue[T any](fetch func() T, rw http.ResponseWriter, r *http.Request) { |
| 141 | query := r.URL.Query() |
| 142 | isYaml := query.Get("format") == "yaml" |
| 143 | isJson := query.Get("format") == "json" |
| 144 | tickDur, err := time.ParseDuration(query.Get("interval")) |
| 145 | if err != nil { |
| 146 | tickDur = time.Second |
| 147 | } |
| 148 | if r.Header.Get("Accept") == "text/event-stream" { |
| 149 | sse := NewSSE(rw, r.Context()) |
| 150 | tick := time.NewTicker(tickDur) |
| 151 | defer tick.Stop() |
| 152 | writer := Conditoinal(isYaml, sse.WriteYAML, sse.WriteJSON) |
| 153 | writer(fetch()) |
| 154 | for range tick.C { |
| 155 | if writer(fetch()) != nil { |
| 156 | return |
| 157 | } |
| 158 | } |
| 159 | } else { |
| 160 | data := fetch() |
| 161 | rw.Header().Set("Content-Type", Conditoinal(isYaml, "text/yaml", "application/json")) |
| 162 | if isYaml { |
| 163 | if err := yaml.NewEncoder(rw).Encode(data); err != nil { |
| 164 | http.Error(rw, err.Error(), http.StatusInternalServerError) |
| 165 | } |
| 166 | } else if isJson { |
| 167 | if err := json.NewEncoder(rw).Encode(APIResult{ |
| 168 | Code: 0, |
| 169 | Data: data, |
| 170 | Message: "ok", |
| 171 | }); err != nil { |
| 172 | json.NewEncoder(rw).Encode(APIError{ |
| 173 | Code: APIErrorJSONEncode, |
| 174 | Message: err.Error(), |
| 175 | }) |
| 176 | } |
| 177 | } else { |
| 178 | t := reflect.TypeOf(data) |
| 179 | switch t.Kind() { |
| 180 | case reflect.String, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: |
| 181 | rw.Header().Set("Content-Type", "text/plain") |
| 182 | fmt.Fprint(rw, data) |
| 183 | default: |
| 184 | if err := json.NewEncoder(rw).Encode(data); err != nil { |
| 185 | http.Error(rw, err.Error(), http.StatusInternalServerError) |
| 186 | } |
| 187 | } |
| 188 | } |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | func ListenUDP(address string, networkBuffer int) (*net.UDPConn, error) { |
| 193 | addr, err := net.ResolveUDPAddr("udp", address) |