tools/validate.go (83 lines of code) (raw):

// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package tools import ( "errors" "flag" "fmt" "os" "regexp" "strconv" ) func validateTool() error { flag := flag.NewFlagSet("validate", flag.ContinueOnError) flag.Usage = printValidateHelp helpFlag := flag.Bool("h", false, "Print this help message.") envFlag := flag.Bool("e", false, "Retrieve value from the environment variable with the given name.") mailFlag := flag.Bool("m", false, "Check if the value is a valid email address.") numberFlag := flag.Bool("n", false, "Check if the value is a number.") regexFlag := flag.String("r", "", "Check if the value matches the given regular expression.") err := flag.Parse(os.Args[1:]) if err != nil { return err } if *helpFlag { flag.Usage() return nil } if flag.NArg() != 1 && flag.NArg() != 2 { flag.Usage() return errors.New("invalid number of arguments") } arg := flag.Arg(0) customErr := flag.Arg(1) if customErr == "" { customErr = "validation failed" } value := arg if *envFlag { value = os.Getenv(arg) if value == "" { return fmt.Errorf("variable '%s' not set", arg) } } if *mailFlag { if !isValidEmail(value) { return fmt.Errorf(customErr) } return nil } if *numberFlag { if !isValidNumber(value) { return fmt.Errorf(customErr) } return nil } if *regexFlag != "" { valid, err := isValidByRegex(value, *regexFlag) if err != nil { return err } if !valid { return fmt.Errorf(customErr) } } return nil } func isValidNumber(number string) bool { _, err := strconv.ParseFloat(number, 64) return err == nil } func isValidEmail(email string) bool { // Regular expression pattern for email validation pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$` // Create a regular expression object regExp := regexp.MustCompile(pattern) // Use the regular expression to match the email string return regExp.MatchString(email) } func isValidByRegex(value string, regex string) (bool, error) { // Create a regular expression object regExp, err := regexp.Compile(regex) if err != nil { return false, err } // Use the regular expression to match the email string return regExp.MatchString(value), nil } func printValidateHelp() { fmt.Println(MarkdownHelp("validate")) }