repo_description: Gin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.
repo_topics: framework gin go middleware performance router server
code: // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
  // Use of this source code is governed by a MIT style
  // license that can be found in the LICENSE file.
  
  package gin
  
  import (
  	"flag"
  	"io"
  	"os"
  	"sync/atomic"
  
  	"github.com/gin-gonic/gin/binding"
  )
  
  // EnvGinMode indicates environment name for gin mode.
  const EnvGinMode = "GIN_MODE"
  
  const (
  	// DebugMode indicates gin mode is debug.
  	DebugMode = "debug"
  	// ReleaseMode indicates gin mode is release.
  	ReleaseMode = "release"
  	// TestMode indicates gin mode is test.
  	TestMode = "test"
  )
  
  const (
  	debugCode = iota
  	releaseCode
  	testCode
  )
  
  // DefaultWriter is the default io.Writer used by Gin for debug output and
  // middleware output like Logger() or Recovery().
  // Note that both Logger and Recovery provides custom ways to configure their
  // output io.Writer.
  // To support coloring in Windows use:
  //
  //	import "github.com/mattn/go-colorable"
  //	gin.DefaultWriter = colorable.NewColorableStdout()
  var DefaultWriter io.Writer = os.Stdout
  
  // DefaultErrorWriter is the default io.Writer used by Gin to debug errors
  var DefaultErrorWriter io.Writer = os.Stderr
  
  var (
  	ginMode  int32 = debugCode
  	modeName atomic.Value
  )
  
  func init() {
  	mode := os.Getenv(EnvGinMode)
  	SetMode(mode)
  }
  
  // SetMode sets gin mode according to input string.
  func SetMode(value string) {
  	if value == "" {
  		if flag.Lookup("test.v") != nil {
  			value = TestMode
  		} else {
  			value = DebugMode
  		}
  	}
  
  	switch value {
  	case DebugMode:
  		atomic.StoreInt32(&ginMode, debugCode)
  	case ReleaseMode:
  		atomic.StoreInt32(&ginMode, releaseCode)
  	case TestMode:
  		atomic.StoreInt32(&ginMode, testCode)
  	default:
  		panic("gin mode unknown: " + value + " (available mode: debug release test)")
  	}
  	modeName.Store(value)
  }
  
  // DisableBindValidation closes the default validator.
  func DisableBindValidation() {
  	binding.Validator = nil
  }
  
  // EnableJsonDecoderUseNumber sets true for binding.EnableDecoderUseNumber to
  // call the UseNumber method on the JSON Decoder instance.
  func EnableJsonDecoderUseNumber() {
  	binding.EnableDecoderUseNumber = true
  }
  
  // EnableJsonDecoderDisallowUnknownFields sets true for binding.EnableDecoderDisallowUnknownFields to
  // call the DisallowUnknownFields method on the JSON Decoder instance.
  func EnableJsonDecoderDisallowUnknownFields() {
  	binding.EnableDecoderDisallowUnknownFields = true
  }
  
  // Mode returns current gin mode.
  func Mode() string {
  	return modeName.Load().(string)
  }
  