func IgnoreCase(opts *Options) {
	opts.IgnoreCase = true
}
IgnoreCase for get/set value by key
package ini
import (
	"fmt"
	"io"
	"os"
	"regexp"
	"strings"
	"sync"
	"github.com/abulo/ratel/v2/config/parser/ini/parser"
	"github.com/pkg/errors"
)
const (
	SepSection = "."
	DefTagName = "ini"
)
var (
	errEmptyKey = errors.New("ini: key name cannot be empty")
	errNotFound = errors.New("ini: key does not exist in the config")
	errReadonly = errors.New("ini: config manager instance in 'readonly' mode")
	dc = New()
)
type Section map[string]string
type Options struct {
	Readonly bool
	ParseEnv bool
	ParseVar bool
	TagName string
	VarOpen string
	VarClose string
	IgnoreCase bool
	DefSection string
	SectionSep string
}
type Ini struct {
	err  error
	opts *Options
	lock sync.RWMutex
	data map[string]Section
	varRegex *regexp.Regexp
}
func New() *Ini {
	return &Ini{
		data: make(map[string]Section),
		opts: newDefaultOptions(),
	}
}
func NewWithOptions(opts ...func(*Options)) *Ini {
	c := New()
	c.WithOptions(opts...)
	return c
}
func Default() *Ini {
	return dc
}
func (c *Ini) ensureInit() {
	if !c.IsEmpty() {
		return
	}
	if c.data == nil {
		c.data = make(map[string]Section)
	}
	if c.opts == nil {
		c.opts = newDefaultOptions()
	}
	if c.opts.ParseVar && c.varRegex == nil {
		l := regexp.QuoteMeta(c.opts.VarOpen)
		r := regexp.QuoteMeta(c.opts.VarClose)
		regStr := l + `([\w-` + c.opts.SectionSep + `]+)` + r
		c.varRegex = regexp.MustCompile(regStr)
	}
}
func newDefaultOptions() *Options {
	return &Options{
		ParseEnv: true,
		VarOpen:  "%(",
		VarClose: ")s",
		TagName:  DefTagName,
		DefSection: parser.DefSection,
		SectionSep: SepSection,
	}
}
func Readonly(opts *Options) {
	opts.Readonly = true
}
func ParseVar(opts *Options) {
	opts.ParseVar = true
}
func ParseEnv(opts *Options) {
	opts.ParseEnv = true
}