Анализ пары ключ-значение в таблице для файла TOML и golang

У меня есть следующая структура для файла TOML:

[database]
host = "localhost"
port = 8086
https = true
username = "root"
password = "root"
db = "test"

[cloud]
deviceType = "2be386e9bbae"
deviceId = "119a705fa3b1"
password = "test"
token = "dqpx5vNLLTR34"
endpoint = "mqtts://mqtt1.endpoint.com"

[gps]
#measurement = "gps"
  [gps.msgpack]
  topic = "/evt/gps/msgpack"

  [gps.json]
  topic = "/evt/gps/json"

[imu]
#measurement = "imu"
  [imu.1]
    tag = "NODE1"
    topic = "/evt/imu1/msgpack"
  [imu.2]
    tag = "NODE2"
    topic = "/evt/imu2/msgpack"

Я хочу установить ключ measurement в таблице gps и таблице imu только один раз и не избыточно в пределах msgpack и json и для 1 и 2

С закомментированными ключами работает следующий код

Код

package main

import (
  "fmt"
  "github.com/BurntSushi/toml"
)

type imu struct {
  Topic string
  Measurement string
  Tag string
}

type gps struct {
  // Measurement string
  Measurement string
  ETopic string `toml:"topic"`
}

type database struct {
  Host  string
  Port  int
  Https bool
  Username  string
  Password  string
  Dbname  string
}

type cloud struct {
  Devicetype  string
  DeviceId  string
  Password  string
  Token   string
  Endpoint  string
}

type tomlConfig struct {
  DB database `toml:"database"`
  Cloud cloud `toml:"cloud"`
  Gps map[string]gps `toml:"gps"`
  Imu map[string]imu  `toml:"imu"`
}


func main()  {

  var config tomlConfig

  if _, err := toml.DecodeFile("cloud.toml", &config); err != nil {
    fmt.Println(err)
    return
  }
  // fmt.Printf("%#v\n", config)
  for sensorName, sensor := range config.Imu {
    fmt.Printf("Topic: %s %s %s %s\n", sensorName, sensor.Topic, sensor.Tag, sensor.Measurement)
  }

  for types, gps := range config.Gps {
    fmt.Printf("%s\n", types)
    fmt.Printf("%s\n", gps.ETopic)
  }
}

Однако, раскомментировав пару значений ключа, я получаю следующее:

 toml: type mismatch for main.gps: expected table but found string

(Это все еще должен быть действительный TOML, так как я перевел его в JSON и проверил структуру)

Я понимаю, что я не упомянул в struct, что мне нужно добавить строку для этого. Однако я запутался в том, как теперь должна выглядеть структура.


person Shan-Desai    schedule 24.12.2018    source источник


Ответы (1)


Ты говоришь:

Я хочу установить ключ измерения в таблице GPS и изменить его только один раз, а не избыточно в msgpack и json, а также для 1 и 2

Вы не делаете этого, потому что создатель формата TOML сказал:

Потому что нам нужен приличный удобочитаемый формат, который однозначно сопоставляется с хэш-таблицей, а спецификация YAML занимает около 80 страниц и вызывает у меня ярость. Нет, JSON не считается. Ты знаешь почему.

Если вам нужно иметь одинаковое значение для одного ключа, например, measurement, вы должны указать его в каждой подтаблице, что хотите.

Ваш правильный файл TOML:

[database]
host = "localhost"
port = 8086
https = true
username = "root"
password = "root"
db = "test"

[cloud]
deviceType = "2be386e9bbae"
deviceId = "119a705fa3b1"
password = "test"
token = "dqpx5vNLLTR34"
endpoint = "mqtts://mqtt1.endpoint.com"

[gps]
[gps.msgpack]
topic = "/evt/gps/msgpack"
measurement = "gps"

[gps.json]
topic = "/evt/gps/json"
measurement = "gps"

[imu]
[imu.1]
measurement = "imu"
tag = "NODE1"
topic = "/evt/imu1/msgpack"
[imu.2]
measurement = "imu"
tag = "NODE2"
topic = "/evt/imu2/msgpack"
person zwirec    schedule 25.12.2018