Проверка наличия строки из файла golang в файле yaml - PullRequest
0 голосов
/ 21 февраля 2020

Я довольно новичок в работе с yaml и golang. В настоящее время я создаю golang программу, которая анализирует пакет rpm для проверки зависимостей подсистемы. Он расширяет библиотеку go -rpmutils .

Пока это код, который у меня есть в моей основной функции для обработки условий:

func main() {
    // Parse the rpm
    rpm, err := rpmutils.ReadRpm("file.rpm")
    if err != nil {
        panic(err)
    }

    // Get RPM Deps
    dependencies, err := rpm.Header.GetStrings(rpmutils.REQUIRENAME)
    if err != nil {
        panic(err)
    }

    // Check for specific dep condition
    for _, p := range dependencies {
        if strings.HasPrefix(p, "prefix1") && p != "string-including-prefix1" {
            fmt.Printf("\t%s\n", p)
            defer os.Exit(1)
        }
    }
}

Я могу вывести зависимости, но хочу установить несколько условий if else для указания времени. c существуют зависимости подсистемы.

В отдельном файле yaml у меня есть:

allowed-deps:
    -dep1
    -dep2
    -dep3

third-party-deps:
    -dep4
    -dep5
    -dep6

internal-deps:
    -dep7
    -dep8
    -dep9

Я бы хотел сравнить значение var p из for для l oop со значениями в файле yaml. Так, например:

  • , если p равно только значениям из допустимых значений deps, выведите «успешно построенные rpm» и не запрашивайте os.Exit (1)
  • , если p равно любому из для сторонних deps выведите «err msg для сторонних deps» и os.Exit (1)
  • , если p равно любым внутренним deps, выведите «another err mssg» и os.Exit (1) )

Как я могу go сделать это?

1 Ответ

2 голосов
/ 21 февраля 2020

Вы можете использовать пакет YAML (например, https://github.com/go-yaml/yaml), загрузить свой файл в переменную и проверять его на каждом шаге в предлагаемых вами ifs. Я бы использовал карты, так как кажется, что вы будете очень часто проверять наборы.

Здесь у вас есть простой пример, который я сделал с использованием этого пакета, чтобы вы могли увидеть, как распаковать ваш файл, преобразовать в карты и проверить карты: https://play.golang.org/p/t1GhUPvAQNQ

package main

import (
    "fmt"
     "github.com/go-yaml/yaml"
)

const str = `
allowed-deps:
    - dep1
    - dep2
    - dep3

third-party-deps:
    - dep4
    - dep5
    - dep6

internal-deps:
    - dep7
    - dep8
    - dep9
`

type MyYAML struct {
    AllowedDeps    []string `yaml:"allowed-deps"`
    ThirdPartyDeps []string `yaml:"third-party-deps"`
    InternalDeps   []string `yaml:"internal-deps"`
}

func main() {
    var a MyYAML
    err := yaml.Unmarshal([]byte(str), &a)
    if err != nil {
        panic(err)
    }

    // Build a map for every section.
    allowedDeps    := map[string]struct{}{}
    thirdPartyDeps := map[string]struct{}{}
    internalDeps   := map[string]struct{}{}

    for _, dep := range a.AllowedDeps {
        allowedDeps[dep] = struct{}{}
    }
    for _, dep := range a.ThirdPartyDeps {
        thirdPartyDeps[dep] = struct{}{}
    }
    for _, dep := range a.InternalDeps {
        internalDeps[dep] = struct{}{}
    }

    // Some checking examples.
    if _, ok := allowedDeps["dep1"]; ok {
        fmt.Println("dep1 found")
    }
    if _, ok := thirdPartyDeps["dep1"]; ok {
        fmt.Println("dep1 found")
    }
    if _, ok := internalDeps["dep8"]; ok {
        fmt.Println("dep8 found")
    }

}
...