update
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/tag Build is failing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/tag Build is failing
				
					Details
				
			
		
	
							parent
							
								
									9eb285bfe8
								
							
						
					
					
						commit
						735ca0ed93
					
				
							
								
								
									
										22
									
								
								README.md
								
								
								
								
							
							
						
						
									
										22
									
								
								README.md
								
								
								
								
							|  | @ -2,6 +2,28 @@ | ||||||
| 
 | 
 | ||||||
| a json config visualizer | a json config visualizer | ||||||
| 
 | 
 | ||||||
|  | ## Usage  | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | Usage: kconfig [options] | ||||||
|  |   -addr string | ||||||
|  |         address to listen (default ":8000") | ||||||
|  |   -dev | ||||||
|  |         turn on dev mode | ||||||
|  |   -f string | ||||||
|  |         file to use as schema, if will watch file change every 120ms | ||||||
|  |   -level int | ||||||
|  |         log level [-1(trace):5(panic)] 7 to disable (default 1) | ||||||
|  |   -name string | ||||||
|  |         name of the app (default "kconfig") | ||||||
|  |   -pretty | ||||||
|  |         log message in human readable format (the original log is json) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Example | ||||||
|  | 
 | ||||||
|  | `kconfig -addr 127.0.0.1:8000 -pretty -level 0 -f dist/test.jcs` | ||||||
|  | 
 | ||||||
| ## Schema | ## Schema | ||||||
| 
 | 
 | ||||||
| JSON Schema Support | JSON Schema Support | ||||||
|  |  | ||||||
|  | @ -3,8 +3,10 @@ package main | ||||||
| import ( | import ( | ||||||
| 	"flag" | 	"flag" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"io/ioutil" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"os" | 	"os" | ||||||
|  | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/rs/zerolog" | 	"github.com/rs/zerolog" | ||||||
| 	"github.com/rs/zerolog/log" | 	"github.com/rs/zerolog/log" | ||||||
|  | @ -13,6 +15,11 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
|  | 	Version = "0.0.0" | ||||||
|  | 	Build   = "alpha" | ||||||
|  | 	flagVer bool | ||||||
|  | 
 | ||||||
|  | 	flagFile    string | ||||||
| 	flagAddr    string | 	flagAddr    string | ||||||
| 	flagAppName string | 	flagAppName string | ||||||
| 
 | 
 | ||||||
|  | @ -22,11 +29,14 @@ var ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func init() { | func init() { | ||||||
|  | 	flag.BoolVar(&flagVer, "v", false, "show version") | ||||||
|  | 
 | ||||||
|  | 	flag.StringVar(&flagFile, "f", "", "file to use as schema, if will watch file change every 120ms") | ||||||
| 	flag.StringVar(&flagAddr, "addr", ":8000", "address to listen") | 	flag.StringVar(&flagAddr, "addr", ":8000", "address to listen") | ||||||
| 	flag.StringVar(&flagAppName, "name", "kconfig", "name of the app") | 	flag.StringVar(&flagAppName, "name", "kconfig", "name of the app") | ||||||
| 
 | 
 | ||||||
| 	flag.BoolVar(&flagDev, "dev", false, "turn on dev mode") | 	flag.BoolVar(&flagDev, "dev", false, "turn on dev mode") | ||||||
| 	flag.IntVar(&flagLogLevel, "level", 1, "log level [-1:5] 7 to disable") | 	flag.IntVar(&flagLogLevel, "level", 1, "log level [-1(trace):5(panic)] 7 to disable") | ||||||
| 	flag.BoolVar(&flagLogPretty, "pretty", false, "log message in human readable format (the original log is json)") | 	flag.BoolVar(&flagLogPretty, "pretty", false, "log message in human readable format (the original log is json)") | ||||||
| 
 | 
 | ||||||
| 	flag.Usage = func() { | 	flag.Usage = func() { | ||||||
|  | @ -36,6 +46,10 @@ func init() { | ||||||
| } | } | ||||||
| func main() { | func main() { | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
|  | 	if flagVer { | ||||||
|  | 		fmt.Printf("%v - %v\n", Version, Build) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
| 	zerolog.TimeFieldFormat = zerolog.TimeFormatUnix | 	zerolog.TimeFieldFormat = zerolog.TimeFormatUnix | ||||||
| 	zerolog.SetGlobalLevel(zerolog.Level(flagLogLevel)) | 	zerolog.SetGlobalLevel(zerolog.Level(flagLogLevel)) | ||||||
| 	if flagLogPretty { | 	if flagLogPretty { | ||||||
|  | @ -49,8 +63,39 @@ func main() { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mux := http.NewServeMux() | 	mux := http.NewServeMux() | ||||||
| 	// mux.Handle("/k/", http.StripPrefix("/k", kconfig.New()))
 | 	k := kconfig.New() | ||||||
| 	mux.Handle("/", kconfig.New()) | 	if flagFile != "" { | ||||||
|  | 		go func() { | ||||||
|  | 			fi, err := os.Stat(flagFile) | ||||||
|  | 			if err != nil { | ||||||
|  | 				log.Panic().Err(err).Msg("") | ||||||
|  | 			} | ||||||
|  | 			last := fi.ModTime().Add(-time.Second) | ||||||
|  | 			for { | ||||||
|  | 				fi, err := os.Stat(flagFile) | ||||||
|  | 				if err != nil { | ||||||
|  | 					log.Panic().Err(err).Msg("") | ||||||
|  | 				} | ||||||
|  | 				if fi.ModTime().After(last) { | ||||||
|  | 					last = fi.ModTime() | ||||||
|  | 					file, err := os.Open(flagFile) | ||||||
|  | 					if err != nil { | ||||||
|  | 						log.Panic().Err(err).Msg("") | ||||||
|  | 					} | ||||||
|  | 					schema, err := ioutil.ReadAll(file) | ||||||
|  | 					if err != nil { | ||||||
|  | 						log.Panic().Err(err).Msg("") | ||||||
|  | 					} | ||||||
|  | 					k.KFJstr = schema | ||||||
|  | 				} | ||||||
|  | 				<-time.After(time.Millisecond * 120) | ||||||
|  | 			} | ||||||
|  | 		}() | ||||||
|  | 	} | ||||||
|  | 	k.Apply = func(b []byte) error { return fmt.Errorf("error %s", "test") } | ||||||
|  | 
 | ||||||
|  | 	// mux.Handle("/k/", http.StripPrefix("/k", k))
 | ||||||
|  | 	mux.Handle("/", k) | ||||||
| 
 | 
 | ||||||
| 	g := guard.New() | 	g := guard.New() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,8 +12,8 @@ import ( | ||||||
| 	"kumoly.io/tools/kconfig/public" | 	"kumoly.io/tools/kconfig/public" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| //go:embed assets/default.kfj
 | //go:embed assets/default.jcs
 | ||||||
| var defaultSchema string | var defaultSchema []byte | ||||||
| 
 | 
 | ||||||
| //go:embed public/index.html
 | //go:embed public/index.html
 | ||||||
| var index string | var index string | ||||||
|  | @ -27,7 +27,7 @@ func init() { | ||||||
| 
 | 
 | ||||||
| type Kconfig struct { | type Kconfig struct { | ||||||
| 	AppName string | 	AppName string | ||||||
| 	KFJstr  string | 	KFJstr  []byte | ||||||
| 	Mux     *http.ServeMux | 	Mux     *http.ServeMux | ||||||
| 
 | 
 | ||||||
| 	Apply func([]byte) error | 	Apply func([]byte) error | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								main.js
								
								
								
								
							
							
						
						
									
										5
									
								
								main.js
								
								
								
								
							|  | @ -31,6 +31,8 @@ import 'spectre.css/dist/spectre-icons.min.css' | ||||||
|     }).catch(err=>{console.log(err);return;}); |     }).catch(err=>{console.log(err);return;}); | ||||||
|     if (!res.ok) { |     if (!res.ok) { | ||||||
|       console.log(res) |       console.log(res) | ||||||
|  |       const errMsg = await res.text() | ||||||
|  |       alert(errMsg) | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
|    |    | ||||||
|  | @ -39,6 +41,9 @@ import 'spectre.css/dist/spectre-icons.min.css' | ||||||
|     const res = await fetch('api/load').catch(err=>{console.log(err);return;}); |     const res = await fetch('api/load').catch(err=>{console.log(err);return;}); | ||||||
|     if (!res.ok) { |     if (!res.ok) { | ||||||
|       console.log(res) |       console.log(res) | ||||||
|  |       const errMsg = await res.text() | ||||||
|  |       alert(errMsg) | ||||||
|  |       return | ||||||
|     } |     } | ||||||
|     const body = await res.json(); |     const body = await res.json(); | ||||||
|     editor.setValue(body); |     editor.setValue(body); | ||||||
|  |  | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -1 +1 @@ | ||||||
| <!DOCTYPE html><html><head><link rel="stylesheet" href="index.e0891ed3.css"><title>{{.AppName}}</title><style>.ace_selection{background:#7f7f00!important}</style></head><body> <div class="container" style="max-width:960px;"> <div class="columns"> <h1 class="col-md-12">{{.AppName}} Config</h1> </div> <div class="columns"> <div class="col-md-12 column"> <button id="submit" class="tiny">Submit</button> <button id="load" class="secondary tiny">Load</button> <button id="download" class="secondary tiny">Download</button> <a id="downloadAnchorElem" style="display:none"></a> <span id="valid_indicator" class="label"></span> </div> </div> <br> <div class="columns"> <div class="col-md-12 column" id="editor_holder"></div> </div> </div> <script type="module" src="index.2e4018f1.js"></script> {{.ACE_JS}} <script>let AppName="{{.AppName}}";</script> </body></html> | <!DOCTYPE html><html><head><link rel="stylesheet" href="index.e0891ed3.css"><title>{{.AppName}}</title><style>.ace_selection{background:#7f7f00!important}</style></head><body> <div class="container" style="max-width:960px;"> <div class="columns"> <h1 class="col-md-12">{{.AppName}} Config</h1> </div> <div class="columns"> <div class="col-md-12 column"> <button id="submit" class="tiny">Submit</button> <button id="load" class="secondary tiny">Load</button> <button id="download" class="secondary tiny">Download</button> <a id="downloadAnchorElem" style="display:none"></a> <span id="valid_indicator" class="label"></span> </div> </div> <br> <div class="columns"> <div class="col-md-12 column" id="editor_holder"></div> </div> </div> <script type="module" src="index.5a7c0711.js"></script> {{.ACE_JS}} <script>let AppName="{{.AppName}}";</script> </body></html> | ||||||
		Loading…
	
		Reference in New Issue