filters

package
v0.0.0-...-5e9c0d7 Latest Latest
Warning

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

Go to latest
Published: Jun 7, 2020 License: MIT Imports: 2 Imported by: 0

README

Package Filters

Intro

The idea of ​​the package is to enable the quick implementation of various custom filters for an HTTP request.

The package already implements all the default methods of the interface filter Filterer in the base filter BaseFilter.

Main struct and interfaces

OrderFilterer - interface filter order, allows you to link its filter ID list to a filter chain

Filterer - the general interface of all filters

BaseFilter - the basic structure of the fully implementing interface Filterer

Main idea

Go have not full inheritance, there is only embedding and aggregation.

Based on this, a model with embedding the basic structure of the filter and the mechanism for obtaining interface pointers are selected. myself.

So because I need pointer to child interface for create flexible design and execute child method of parents struct, mechanism of pointer to themself in BaseFilter is used.
At the begining you always need to set self pointer by used method!

InterfaceCustomFilter.SetSelfPointer(&InterfaceCustomFilter) // ATTENTION! ALWAYS SET THIS! Self pointer! IMPORTANT!

Usage

Example create New Filter:

type MyCustomFilter struct {
    filter.BaseFilter
    
    // ... any custom fields
}

Examples

@see Examples at filters_test.go

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BaseFilter

type BaseFilter struct {
	Name string // наименование фильтра
	// contains filtered or unexported fields
}

BaseFilter - Базовая структура фильтра

func (*BaseFilter) After

After - метод фильтра вызывающийся после Filter

func (*BaseFilter) Before

func (f *BaseFilter) Before(http.ResponseWriter, *http.Request)

Before - метод фильтра вызывающийся до Filter

func (*BaseFilter) ErrorHandler

func (f *BaseFilter) ErrorHandler(w http.ResponseWriter, r *http.Request, err interface{})

ErrorHandler - метод фильтра вызывающийся в случае ошибки на уровне фильтра

func (*BaseFilter) Filter

func (f *BaseFilter) Filter(http.ResponseWriter, *http.Request)

Filter - основной метод фильтра

func (*BaseFilter) GeneratorDeferRunFunc

func (f *BaseFilter) GeneratorDeferRunFunc(w http.ResponseWriter, r *http.Request) func()

GeneratorDeferRunFunc - метод создания базового дефера с обработкой паники с помощью вызова функции ErrorHandler

func (*BaseFilter) GetBaseFilter

func (f *BaseFilter) GetBaseFilter() Filterer

GetBaseFilter - метод возразает родительскую структуру фильтра (BaseFilter)

func (*BaseFilter) GetNextFilter

func (f *BaseFilter) GetNextFilter() *Filterer

GetNextFilter - метод получения текущего указателя на интерфейс след. фильтра nolint

func (*BaseFilter) GetSelfPointer

func (f *BaseFilter) GetSelfPointer() *Filterer

GetSelfPointer - метод получения текущего указателя себя (указатель на интерфейс себя) nolint

func (*BaseFilter) Info

func (f *BaseFilter) Info() string

Info - метод возращает информацию по фильтру

func (*BaseFilter) Run

func (f *BaseFilter) Run(w http.ResponseWriter, r *http.Request, businessFunc func(http.ResponseWriter, *http.Request))

Run - метод стартующий вызов других методов фильтра

Example
// Define some struct and methods @see upper

// Build filter struct (better use gobeans way create obj @see here --> github.com/imperiuse/golib/gobeans )
CustomFilter := MyFirstCustomFilter{}
CustomFilter.Name = "MyCustomFilter"

CustomFilter2 := MyFirstCustomFilter{}
CustomFilter2.Name = "MyCustomFilter2"

// Get interface by pointer filter struct
InterfaceCustomFilter := Filterer(&CustomFilter)   // IMPORTANT! Better work with interface type of Filterer
InterfaceCustomFilter2 := Filterer(&CustomFilter2) // IMPORTANT! Better work with interface type of Filterer

InterfaceCustomFilter.SetSelfPointer(&InterfaceCustomFilter) // ATTENTION! ALWAYS SET THIS! Self pinter! IMPORTANT!
InterfaceCustomFilter.SetNextFilter(&InterfaceCustomFilter2) // next filter pointer

InterfaceCustomFilter2.SetSelfPointer(&InterfaceCustomFilter2) // ATTENTION! ALWAYS SET THIS! Self pinter! IMPORTANT!
InterfaceCustomFilter2.SetNextFilter(nil)                      // next filter pointer

// Let's test

// Our child Info method
InterfaceCustomFilter.Info() //print: [MyCustomFilter]: ...

// Parent method
InterfaceCustomFilter.GetBaseFilter().Info() //print: [BaseFilter] Before():

// Start filter
var response http.ResponseWriter
var request *http.Request
bf := func(http.ResponseWriter, *http.Request) { return } // empty func

InterfaceCustomFilter.Run(response, request, bf) // Run all Filter in rigth order
// MyCustomFilter.Before()->MyCustomFilter.Filter()->MyCustomFilter.GetNextFilter() == return MyCustomFilter2
// MyCustomFilter2.Run()->MyCustomFilter2.Before()->MyCustomFilter2.Filter()->->MyCustomFilter.GetNextFilter() == nil
// MyCustomFilter2.After()->MyCustomFilter.After()-> end.
Output:

func (*BaseFilter) SetNextFilter

func (f *BaseFilter) SetNextFilter(nf *Filterer)

SetNextFilter - метод для установки указателя на интерфейс след. фильтра nolint

func (*BaseFilter) SetSelfPointer

func (f *BaseFilter) SetSelfPointer(self *Filterer)

SetSelfPointer - метод для установки указателя на себя (указатель на интерфейс себя) nolint

type Filterer

type Filterer interface {
	GetBaseFilter() Filterer // Метод получения родителя

	SetNextFilter(*Filterer)  // Метод установки указателя на следующий фильтр (интерфейс фильтра)
	SetSelfPointer(*Filterer) // Метод установки указателя на себя (указатель на интерфейс себя)

	GetNextFilter() *Filterer  // Метод получения указателя на следующий фильтр (интерфейс фильтра)
	GetSelfPointer() *Filterer // Метод получения указателя на себя (указатель на интерфейс себя)

	Info() string // Метод получения информации по фильтру

	Before(http.ResponseWriter, *http.Request) // 1 Вспомогательный метод - предварительный метод фильтра
	Filter(http.ResponseWriter, *http.Request) // Основной метод фильтра
	After(http.ResponseWriter, *http.Request)  // 2 Вспомогательный метод - заключительный метод фильтра

	// Метод стартующий выполнение методов фильтра, в которой последовательно вызваются методы:
	// 			Before()->Filter()->GetNextFilter().Run()->After()
	//  При возникновении ошибки вызывается метод ErrorHandler
	Run(http.ResponseWriter, *http.Request, func(http.ResponseWriter, *http.Request))
	GeneratorDeferRunFunc(http.ResponseWriter, *http.Request) func() // Генератор Defer для функции Run
	ErrorHandler(http.ResponseWriter, *http.Request, interface{})    // Метод вызывающийся в случае ошибки на уровне

}

Filterer - базовый интерфейс фильтров

type OrderFilterer

type OrderFilterer interface {
	// Get order of filters
	GetOrderFilters() []string
	// Append some new filter to chains. !ATTENTION! MODIFY FILTER ! SetNextFilterPointer() to each input Filter!!!
	AppendFilter(...Filterer)
	// Get N-й filter. 0 - First, ... n - Last
	GetFilterN(int) Filterer
	// Generate func - handle fun - filtered handle func of action
	GenerateFilteredHandleFunc(func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request)
}

OrderFilterer - order of filter interface

type OrderFilters

type OrderFilters struct {
	Order []string
	// contains filtered or unexported fields
}

OrderFilters - order of filter struct

func (*OrderFilters) AppendFilter

func (filterOrder *OrderFilters) AppendFilter(filters ...Filterer)

AppendFilter - Append some new filter to chains. !ATTENTION! MODIFY FILTER ! SetNextFilterPointer() to each input Filter!!! @param

filters     ...Filterer    -  some Filters interfaces that will chain of filters
Example

ExampleOrderFilters_AppendFilter - an example of use OrderFilterer

// At the begin, we have coupled of filters in map of Filter
// better use MapBeansType --> @see github.com/imperiuse/gobeans   Type: MapBeansType
mapOfFilterer := map[string]Filterer{"f1": &BaseFilter{}, "f2": &BaseFilter{}, "f3": &BaseFilter{}}
// Create new Filter Order
fOrder := OrderFilterer(&OrderFilters{[]string{"f1", "f2", "f3"}, nil})
// Configure Filterer to chain of Filters
for _, nameFilter := range fOrder.GetOrderFilters() {
	fOrder.AppendFilter(mapOfFilterer[nameFilter])
}
// Next, we have some business func, which we want "decorate" by own filters with special order define upper
businesFunc := func(http.ResponseWriter, *http.Request) { return }
// Do this!
summaryFilteredBusinesFuncf := fOrder.GenerateFilteredHandleFunc(businesFunc)
_ = summaryFilteredBusinesFuncf
Output:

func (*OrderFilters) GenerateFilteredHandleFunc

func (filterOrder *OrderFilters) GenerateFilteredHandleFunc(handleFunc func(http.ResponseWriter, *http.Request)) func(w http.ResponseWriter, r *http.Request)

GenerateFilteredHandleFunc - Generate func - handle fun - filtered handle func of action ATTENTION CAN PANIC! nolint

@param
			handleFunc 	func(http.ResponseWriter, *http.Request)      -  handle of action
@return
						func(w http.ResponseWriter, r *http.Request)  -  total handle func

func (*OrderFilters) GetFilterN

func (filterOrder *OrderFilters) GetFilterN(n int) Filterer

GetFilterN - Get N-й filter. 0 - First, ... n - Last @param

n   int    -  number of filter in chain

func (*OrderFilters) GetOrderFilters

func (filterOrder *OrderFilters) GetOrderFilters() []string

GetOrderFilters - Get order of filters @return

[]string    -   slice of string (name filters)

Jump to

Keyboard shortcuts

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