code.pfad.fr/gohmekit@v0.2.1/cmd/generate/main.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"log"
     6  	"os"
     7  	"regexp"
     8  	"strings"
     9  )
    10  
    11  func main() {
    12  	if err := run(); err != nil {
    13  		log.Fatal(err)
    14  	}
    15  }
    16  
    17  func run() error {
    18  	m, err := parseMetadata("hapip/metadata.json")
    19  	if err != nil {
    20  		return err
    21  	}
    22  
    23  	// fmt.Println(c)
    24  	if err := writeCharacteristic(m.Characteristics); err != nil {
    25  		return err
    26  	}
    27  	if err := writeService(m); err != nil {
    28  		return err
    29  	}
    30  	if err := writeCategories(m.Categories); err != nil {
    31  		return err
    32  	}
    33  
    34  	return nil
    35  }
    36  
    37  func parseMetadata(path string) (Metadata, error) {
    38  	r, err := os.Open(path)
    39  	if err != nil {
    40  		return Metadata{}, err
    41  	}
    42  	defer r.Close()
    43  
    44  	var m Metadata
    45  	return m, json.NewDecoder(r).Decode(&m)
    46  }
    47  
    48  var specialChars = regexp.MustCompile(`[^0-9a-zA-Z_ ]`)
    49  
    50  func clean(s string) string {
    51  	underscored := strings.ReplaceAll(strings.TrimSpace(s), ".", "")
    52  	return specialChars.ReplaceAllString(underscored, "")
    53  }
    54  
    55  func camelCase(s string) string {
    56  	s = clean(s)
    57  	s = titleCase(s)
    58  	return strings.ReplaceAll(s, " ", "")
    59  }
    60  
    61  func titleCase(s string) string {
    62  	previousIsSpace := false
    63  	var result string
    64  	for _, r := range s {
    65  		if previousIsSpace {
    66  			result += strings.ToUpper(string(r))
    67  		} else {
    68  			result += string(r)
    69  		}
    70  		previousIsSpace = r == ' '
    71  	}
    72  	return result
    73  }
    74  
    75  var appleShort = regexp.MustCompile(`^0*([1-9A-F][0-9A-F]*)-0000-1000-8000-0026BB765291$`)
    76  
    77  func shortUUID(s string) string {
    78  	matches := appleShort.FindStringSubmatch(s)
    79  	if len(matches) > 1 {
    80  		return matches[1]
    81  	}
    82  	return s
    83  }