38 lines
		
	
	
		
			812 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			38 lines
		
	
	
		
			812 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package common
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"encoding/json"
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"io/ioutil"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// LoadJSON reads the given file and unmarshals its content.
							 | 
						||
| 
								 | 
							
								func LoadJSON(file string, val interface{}) error {
							 | 
						||
| 
								 | 
							
									content, err := ioutil.ReadFile(file)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if err := json.Unmarshal(content, val); err != nil {
							 | 
						||
| 
								 | 
							
										if syntaxerr, ok := err.(*json.SyntaxError); ok {
							 | 
						||
| 
								 | 
							
											line := findLine(content, syntaxerr.Offset)
							 | 
						||
| 
								 | 
							
											return fmt.Errorf("JSON syntax error at %v:%v: %v", file, line, err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return fmt.Errorf("JSON unmarshal error in %v: %v", file, err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// findLine returns the line number for the given offset into data.
							 | 
						||
| 
								 | 
							
								func findLine(data []byte, offset int64) (line int) {
							 | 
						||
| 
								 | 
							
									line = 1
							 | 
						||
| 
								 | 
							
									for i, r := range string(data) {
							 | 
						||
| 
								 | 
							
										if int64(i) >= offset {
							 | 
						||
| 
								 | 
							
											return
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if r == '\n' {
							 | 
						||
| 
								 | 
							
											line++
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return
							 | 
						||
| 
								 | 
							
								}
							 |