go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/swarming/server/cfg/validation.go (about)

     1  // Copyright 2023 The LUCI Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package cfg
    16  
    17  import (
    18  	"google.golang.org/protobuf/encoding/prototext"
    19  	"google.golang.org/protobuf/proto"
    20  
    21  	"go.chromium.org/luci/config/validation"
    22  )
    23  
    24  func init() {
    25  	addProtoValidator("settings.cfg", validateSettingsCfg)
    26  	addProtoValidator("pools.cfg", validatePoolsCfg)
    27  	addProtoValidator("bots.cfg", validateBotsCfg)
    28  }
    29  
    30  // addProtoValidator registers a validator for text proto service configs.
    31  func addProtoValidator[T any, TP interface {
    32  	*T
    33  	proto.Message
    34  }](path string, cb func(ctx *validation.Context, t *T)) {
    35  	validation.Rules.Add("services/${appid}", path,
    36  		func(ctx *validation.Context, _, path string, content []byte) error {
    37  			ctx.SetFile(path)
    38  			var msg TP = new(T)
    39  			if err := prototext.Unmarshal(content, msg); err != nil {
    40  				ctx.Error(err)
    41  			} else {
    42  				cb(ctx, msg)
    43  			}
    44  			return nil
    45  		},
    46  	)
    47  }