You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: config.go
    path of file: ./repos/grv/cmd/grv
    
    the code of the file until where you have to start completion: package main

import (
	"bytes"
	"encoding/hex"
	"fmt"
	"os"
	"reflect"
	"regexp"
	"sort"
	"strconv"
	"strings"
	"unicode/utf8"

	log "github.com/Sirupsen/logrus"
	slice "github.com/bradfitz/slice"
)

const (
	cfDefaultConfigHomeDir                = "/.config"
	cfGrvConfigDir                        = "/grv"
	cfGrvrcFile                           = "/grvrc"
	cfTabWidthMinValue                    = 1
	cfTabWidthDefaultValue                = 8
	cfClassicThemeName                    = "classic"
	cfSolarizedThemeName                  = "solarized"
	cfMouseDefaultValue                   = false
	cfMouseScrollRowsDefaultValue         = 3
	cfCommitGraphDefaultValue             = false
	cfConfirmCheckoutDefaultValue         = true
	cfPromptHistorySizeDefaultValue       = 1000
	cfGitBinaryFilePathDefaultValue       = ""
	cfCommitLimitDefaultValue             = "100000"
	cfDefaultViewDefaultValue             = ""
	cfDiffDisplayDefaultValue             = "fancy"
	cfInputPromptAfterCommandDefaultValue = true

	cfAllView             = "All"
	cfMainView       
    
func NewConfiguration(keyBindings KeyBindings, channels Channels, variables GRVVariableGetter, inputConsumer InputConsumer) *Configuration {
	config := &Configuration{
		keyBindings:    keyBindings,
		channels:       channels,
		variables:      variables,
		inputConsumer:  inputConsumer,
		customCommands: map[string]string{},
		themes: map[string]MutableTheme{
			cfClassicThemeName:   NewClassicTheme(),
			cfSolarizedThemeName: NewSolarizedTheme(),
		},
	}

	config.configVariables = map[ConfigVariable]*ConfigurationVariable{
		CfTabWidth: {
			defaultValue: cfTabWidthDefaultValue,
			validator:    tabWidithValidator{},
			description:  fmt.Sprintf("Tab character screen width (minimum value: %v)", cfTabWidthMinValue),
		},
		CfTheme: {
			defaultValue: cfSolarizedThemeName,
			validator: themeValidator{
				config: config,
			},
			description: "The currently active theme",
		},
		CfMouse: {
			defaultValue: cfMouseDefaultValue,
			validator: booleanValueValidator{
				variableName: string(CfMouse),
			},
			description: "Mouse support enabled",
		},
		CfMouseScrollRows: {
			defaultValue: cfMouseScrollRowsDefaultValue,
			validator:    mouseScrollRowsValidator{},
			description:  "Number of rows scrolled for each mouse event",
		},
		CfCommitGraph: {
			defaultValue: cfCommitGraphDefaultValue,
			validator: booleanValueValidator{
				variableName: string(CfCommitGraph),
			},
			description: "Commit graph visible",
		},
		CfConfirmCheckout: {
			defaultValue: cfConfirmCheckoutDefaultValue,
			validator: booleanValueValidator{
				variableName: string(CfConfirmCheckout),
			},
			description: "Confirm before performing git checkout",
		},
		CfPromptHistorySize: {
			defaultValue: cfPromptHistorySizeDefaultValue,
			validator:    promptHistorySizeValidator{},
			description:  "Maximum number of prompt entries retained",
		},
		CfGitBinaryFilePath: {
			defaultValue: cfGitBinaryFilePathDefaultValue,
			description:  "File path to git binary. Required only when git binary is not in $PATH",
		},
		CfCommitLimit: {
			defaultValue: cfCommitLimitDefaultValue,
			description:  "Limit the number of commits loaded. Allowed values: number, date, oid or tag",
		},
		CfDefaultView: {
			defaultValue: cfDefaultViewDefaultValue,
			validator:    &defaultViewValidator{config: config},
			description:  "Command to generate a custom default view on start up",
		},
		CfDiffDisplay: {
			defaultValue: cfDiffDisplayDefaultValue,
			validator:    &diffDisplayValidator{},
			description:  "Diff display format",
		},
		CfInputPromptAfterCommand: {
			defaultValue: cfInputPromptAfterCommandDefaultValue,
			validator: booleanValueValidator{
				variableName: string(CfInputPromptAfterCommand),
			},
			description: `Display "Press any key to continue" after executing external command`,
		},
	}

	for _, configVariable := range config.configVariables {
		configVariable.value = configVariable.defaultValue
	}

	return config
}