dataaccess

package
v0.0.0-...-8b292c0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 18, 2022 License: MIT Imports: 3 Imported by: 0

README

#KPS Go Library - Data Access

Documentation

Overview

********************************************************************************** The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **********************************************************************************

********************************************************************************** The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **********************************************************************************

********************************************************************************** The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **********************************************************************************

********************************************************************************** The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **********************************************************************************

********************************************************************************** The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **********************************************************************************

Index

Constants

This section is empty.

Variables

View Source
var (
	// InvalidDataSourceType is a Dataaccess error code  that represents an
	// unsupported DataSourceType value was used
	InvalidDataSourceType = 601
	// ErrInvalidDataSourceType is used when an invalid DataSourceType value was
	// used
	ErrInvalidDataSourceType = fmt.Errorf("[%d] invalid or unsupported data source type", InvalidDataSourceType)
)
View Source
var (
	// InvalidQueryClauseConnector is a Dataaccess error code  that represents an
	// unsupported QueryClauseConnector value was used
	InvalidQueryClauseConnector = 602
	// ErrInvalidQueryClauseConnector is used when an invalid query cluase connector
	// has been used
	ErrInvalidQueryClauseConnector = fmt.Errorf("[%d] invalid or unsupported query clause connector", InvalidQueryClauseConnector)
)
View Source
var (
	// InvalidQueryClauseComparator is MobiusX Error Code that represents an
	// unsupported Query Clause Comparator values was used
	InvalidQueryClauseComparator = 605
	// ErrInvalidQueryClauseComparator is use dwhen an invalid query clause
	// comparator is used
	ErrInvalidQueryClauseComparator = fmt.Errorf("[%d] invalid or unsupported query clasue comparator specified", InvalidQueryClauseComparator)
)
View Source
var (
	// InvalidDataAccessErrorType is MobiusX Error Code that represents an
	// unsupported ErrorType value was used
	InvalidDataAccessErrorType = 606
	// ErrInvalidDataAccessErrorType is use when an invalid error type is used
	ErrInvalidDataAccessErrorType = fmt.Errorf("[%d] invalid or unsupported error type specified", InvalidDataAccessErrorType)
)
View Source
var (
	// ErrNotImplementedException is used when a method has not been implmented
	ErrNotImplementedException = NewDataAccessError("not implemented exception", NOTIMPLEMENTED)
	// ErrNoResultsFound is used when a query returns no results
	ErrNoResultsFound = NewDataAccessError("no results found from query", NOTFOUND)
)

Functions

This section is empty.

Types

type ConnectionParameters

type ConnectionParameters struct {
	//Connection interface{}           `json:"connection" env:"DSCONNECTIONSTRING"`
	Connection []string              `json:"connection" env:"DSCONNECTIONSTRING" envSeparator:","`
	Auth       DataSourceCredentials `json:"auth"`
}

ConnectionParameters holds all of the connection related data required to connect to a data source

type DataAccessError

type DataAccessError struct {
	InnerError          error               `json:"innererror"`
	Message             string              `json:"message"`
	Type                string              `json:"type"`
	Reason              string              `json:"reason"`
	Code                int                 `json:"code"`
	DataAccessErrorType DataAccessErrorType `json:"errortype"`
}

DataAccessError is a specialized Error value that represents the different errors that can be returned from Data Access operations

func NewDataAccessError

func NewDataAccessError(message string, dataAccessErrorType DataAccessErrorType) DataAccessError

NewDataAccessError creates and returns a new DataAccessError object

func (DataAccessError) Error

func (dataAccessError DataAccessError) Error() string

Error implements the Error interface, making dataAccessError a valid Error

func (DataAccessError) MarshalJSON

func (dataAccessError DataAccessError) MarshalJSON() ([]byte, error)

MarshalJSON is a method implemented allowing serialization of the ErrorType value to its string representation

func (*DataAccessError) UnmarshalJSON

func (dataAccessError *DataAccessError) UnmarshalJSON(data []byte) error

UnmarshalJSON is a method implemented allowing de-serialization of the ErrorType value from a string to its ErrorType representation

type DataAccessErrorType

type DataAccessErrorType int

DataAccessErrorType represents an enumeration constant for the types of data access errors returned from data access operations

const (
	// NOTIMPLEMENTED is an enumerated constant representing an error where the
	// requested functionality functionality has not been implemented
	NOTIMPLEMENTED DataAccessErrorType = iota
	// NOTFOUND is an enumerated constant representing an error where the results of
	// the query contain no records
	NOTFOUND
	// QUERY is an enumerated constant representing an error that occurred/returned
	// from the data source when executing a query
	QUERY
)

func DataAccessErrorTypeFromString

func DataAccessErrorTypeFromString(errorTypeString string) (errorType DataAccessErrorType, err error)

DataAccessErrorTypeFromString returns the ErrorType from the errorTypeString representation

func (DataAccessErrorType) String

func (errorType DataAccessErrorType) String() string

String returns the string representation in lower case for the error type value

type DataSource

type DataSource interface {
	Client() interface{}
}

DataSource is an interface that represents an abstracted instance of a datasource.

type DataSourceConfiguration

type DataSourceConfiguration struct {
	DataSource           DataSourceType         `json:"datasourcetype" env:"DSTYPE" mapstructure:"datasourcetype"`
	ConnectionParameters ConnectionParameters   `json:"connectionparameters" env:"CONNECTION_PARAMETERS"`
	DataSourceParameters map[string]interface{} `json:"datasourceparameters" env:"DATASOURCE_PARAMETERS"`
	Serverless           bool                   `json:"serverless" env:"SERVERLESS"`
}

DataSourceConfiguration represents the generic configuration object supplying all of the required parameters for leveraging the designated data source

func (DataSourceConfiguration) MarshalJSON

func (dsCfg DataSourceConfiguration) MarshalJSON() ([]byte, error)

MarshalJSON is a method implemented allowing serialization of the DataSourceType value from an enumerated type to a string

func (*DataSourceConfiguration) UnmarshalEnv

func (dsCfg *DataSourceConfiguration) UnmarshalEnv() error

UnmarshalEnv is method for allowing the DataSourceType to be passed in the environment and deserialized. This method satisfies the ParseEnv interface

func (*DataSourceConfiguration) UnmarshalJSON

func (dsCfg *DataSourceConfiguration) UnmarshalJSON(data []byte) error

UnmarshalJSON is a method implemented allowing de-serialization of the DataSourceType value from a string to an enumerated type

type DataSourceCredentials

type DataSourceCredentials struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

DataSourceCredentials holds all of the data required to connect to a data source. Meant to be used to build the connection string

type DataSourceType

type DataSourceType int

DataSourceType represents an Enum type for the different supported data sources that an application can leverage

const (
	// DYNAMODB represents a DynamoDB data source
	DYNAMODB DataSourceType = iota
	// ELASTICSEARCH represents an Elasticsearch data source
	ELASTICSEARCH
	// REDIS represents a Redis cache data source
	REDIS
	// ETCD represents an Etcd data source
	ETCD
	// FILESOURCE represents a File on the file system data source
	FILESOURCE
)

func DataSourceTypeFromString

func DataSourceTypeFromString(dsTypeString string) (returnType DataSourceType, err error)

DataSourceTypeFromString returns the data source type from a string representation

func (DataSourceType) String

func (dsType DataSourceType) String() string

String returns the string representation of a DataSourceType

type DataSources

type DataSources map[string]*DataSourceConfiguration

DataSources represents a map of generic configuration objects that, when processed, translates in to a map of DataSource objects

type Document

type Document interface {
	GetID() string
	Type() string
	JSON() string
}

Document defines the interface that all doata object/documents leveraging the DataAccess library needs to conform to, allowing a modular use of different DBs within a project

type Query

type Query struct {
	Select    QueryClauseGroup
	Filters   QueryClauseGroup
	IndexName string
}

Query is a struct that represents a query being made against a DataSource

type QueryClauseComparator

type QueryClauseComparator int

QueryClauseComparator represents an enumeration constant for the types of valid comparison operations for a specific query clause value

const (
	// EQ is an enumerated constant representing an equality operation for a query
	// clause value
	EQ QueryClauseComparator = iota
	// LT is an enumerated constant representing a 'less than' comparison operation
	// for a query clause value. Is only valid for a number type
	LT
	// LTE is an enumerated constant representing a 'less than or equal' comparison
	// operation for a query clause value. Is only valid for a number type
	LTE
	// GT is an enumerated constant representing a 'greater than' operation for a
	// query clause value. Is only valid for a number type
	GT
	// GTE is an enumerated constant representing a 'greater then or equal'
	// operation for a query clause value. Is only valid for a number type
	GTE
	// BETWEEN is an enumerated constant representing a range between but not equal
	// to the range values
	BETWEEN
	// BETWEENE is an enumerated constant representing a range between and can be
	// equal to the range values
	BETWEENE
)

func QueryClauseComparatorFromString

func QueryClauseComparatorFromString(queryClauseComparatorString string) (returnComparator QueryClauseComparator, err error)

QueryClauseComparatorFromString returns the QueryClauseComparator from the queryClauseComparator string representation

func (QueryClauseComparator) GetSymbol

func (queryClauseComparator QueryClauseComparator) GetSymbol() string

GetSymbol is a conveinece function for returning a string repsentation of the QueryClauseComparator symbol

func (QueryClauseComparator) String

func (queryClauseComparator QueryClauseComparator) String() string

String returns the string representation in lower case for the query clause value comparator type

type QueryClauseConnector

type QueryClauseConnector int

QueryClauseConnector represents an enum type for the different support clause 'conjunctions' that a query can leverage

const (
	// AND represents a set and operation
	AND QueryClauseConnector = iota
	// OR represents a set or operation
	OR
	// NOT represents a set not operation
	NOT
	// COMMA simply represents a comma separated list instead of clause value
	COMMA
	// LIKE represents a fuzzy and is only applicable with data sources that support
	// it (such as ElasticSearch)
	LIKE
	// NONE represents that value that no clause operator is required
	NONE
)

func QueryClauseConnectorFromString

func QueryClauseConnectorFromString(queryClauseConnectorString string) (returnConnector QueryClauseConnector, err error)

QueryClauseConnectorFromString returns the data source type from a string representation

func (QueryClauseConnector) GetSymbol

func (queryClauseConnector QueryClauseConnector) GetSymbol() string

GetSymbol is a conveinece function for returning a string repsentation of the QueryClauseConnector symbol

func (QueryClauseConnector) String

func (queryClauseConnector QueryClauseConnector) String() string

String returns the string representation of a DataSourceType

type QueryClauseGroup

type QueryClauseGroup map[QueryClauseConnector][]QueryClauseValue

QueryClauseGroup represents a logical grouping of QueryClauseValues that are logically connected via the QueryClauseConnector Value

type QueryClauseValue

type QueryClauseValue struct {
	Attribute  string
	Value      interface{}
	Comparator QueryClauseComparator
}

QueryClauseValue represents a particular value related to a column or attribute in a DataSource

type UnmarshalFn

type UnmarshalFn func(interface{}) ([]Document, error)

UnmarshalFn is used to unmarshal the object returned from a specific database call to the appropriate object

Directories

Path Synopsis
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
ddb
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
scratch
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
********************************************************************************** The MIT License (MIT) Copyright (c) 2022 Sean Beard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL