Copied mongo repo (to patch it)
This commit is contained in:
		
							
								
								
									
										80
									
								
								mongo/tag/tag.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								mongo/tag/tag.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| // Copyright (C) MongoDB, Inc. 2017-present. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||
| // not use this file except in compliance with the License. You may obtain | ||||
| // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| // Package tag provides a way to define filters for tagged servers. | ||||
| package tag // import "go.mongodb.org/mongo-driver/tag" | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Tag is a name/vlaue pair. | ||||
| type Tag struct { | ||||
| 	Name  string | ||||
| 	Value string | ||||
| } | ||||
|  | ||||
| // String returns a human-readable human-readable description of the tag. | ||||
| func (tag Tag) String() string { | ||||
| 	return fmt.Sprintf("%s=%s", tag.Name, tag.Value) | ||||
| } | ||||
|  | ||||
| // NewTagSetFromMap creates a new tag set from a map. | ||||
| func NewTagSetFromMap(m map[string]string) Set { | ||||
| 	var set Set | ||||
| 	for k, v := range m { | ||||
| 		set = append(set, Tag{Name: k, Value: v}) | ||||
| 	} | ||||
|  | ||||
| 	return set | ||||
| } | ||||
|  | ||||
| // NewTagSetsFromMaps creates new tag sets from maps. | ||||
| func NewTagSetsFromMaps(maps []map[string]string) []Set { | ||||
| 	sets := make([]Set, 0, len(maps)) | ||||
| 	for _, m := range maps { | ||||
| 		sets = append(sets, NewTagSetFromMap(m)) | ||||
| 	} | ||||
| 	return sets | ||||
| } | ||||
|  | ||||
| // Set is an ordered list of Tags. | ||||
| type Set []Tag | ||||
|  | ||||
| // Contains indicates whether the name/value pair exists in the tagset. | ||||
| func (ts Set) Contains(name, value string) bool { | ||||
| 	for _, t := range ts { | ||||
| 		if t.Name == name && t.Value == value { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // ContainsAll indicates whether all the name/value pairs exist in the tagset. | ||||
| func (ts Set) ContainsAll(other []Tag) bool { | ||||
| 	for _, ot := range other { | ||||
| 		if !ts.Contains(ot.Name, ot.Value) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // String returns a human-readable human-readable description of the tagset. | ||||
| func (ts Set) String() string { | ||||
| 	var b bytes.Buffer | ||||
| 	for i, tag := range ts { | ||||
| 		if i > 0 { | ||||
| 			b.WriteString(",") | ||||
| 		} | ||||
| 		b.WriteString(tag.String()) | ||||
| 	} | ||||
| 	return b.String() | ||||
| } | ||||
							
								
								
									
										96
									
								
								mongo/tag/tag_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								mongo/tag/tag_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| // Copyright (C) MongoDB, Inc. 2017-present. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||
| // not use this file except in compliance with the License. You may obtain | ||||
| // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| package tag | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/require" | ||||
| 	"go.mongodb.org/mongo-driver/internal/testutil/assert" | ||||
| ) | ||||
|  | ||||
| func TestTag_String(t *testing.T) { | ||||
| 	t.Parallel() | ||||
|  | ||||
| 	tag := Tag{Name: "a", Value: "1"} | ||||
| 	assert.Equal(t, "a=1", tag.String(), `expected "a=1", got %q`, tag.String()) | ||||
| } | ||||
|  | ||||
| func TestTagSets_NewTagSet(t *testing.T) { | ||||
| 	t.Parallel() | ||||
|  | ||||
| 	ts := Set{Tag{Name: "a", Value: "1"}} | ||||
|  | ||||
| 	require.True(t, ts.Contains("a", "1")) | ||||
| 	require.False(t, ts.Contains("1", "a")) | ||||
| 	require.False(t, ts.Contains("A", "1")) | ||||
| 	require.False(t, ts.Contains("a", "10")) | ||||
| } | ||||
|  | ||||
| func TestTagSets_NewTagSetFromMap(t *testing.T) { | ||||
| 	t.Parallel() | ||||
|  | ||||
| 	ts := NewTagSetFromMap(map[string]string{"a": "1"}) | ||||
|  | ||||
| 	require.True(t, ts.Contains("a", "1")) | ||||
| 	require.False(t, ts.Contains("1", "a")) | ||||
| 	require.False(t, ts.Contains("A", "1")) | ||||
| 	require.False(t, ts.Contains("a", "10")) | ||||
| } | ||||
|  | ||||
| func TestTagSets_NewTagSetsFromMaps(t *testing.T) { | ||||
| 	t.Parallel() | ||||
|  | ||||
| 	tss := NewTagSetsFromMaps([]map[string]string{{"a": "1"}, {"b": "1"}}) | ||||
|  | ||||
| 	require.Len(t, tss, 2) | ||||
|  | ||||
| 	ts := tss[0] | ||||
| 	require.True(t, ts.Contains("a", "1")) | ||||
| 	require.False(t, ts.Contains("1", "a")) | ||||
| 	require.False(t, ts.Contains("A", "1")) | ||||
| 	require.False(t, ts.Contains("a", "10")) | ||||
|  | ||||
| 	ts = tss[1] | ||||
| 	require.True(t, ts.Contains("b", "1")) | ||||
| 	require.False(t, ts.Contains("1", "b")) | ||||
| 	require.False(t, ts.Contains("B", "1")) | ||||
| 	require.False(t, ts.Contains("b", "10")) | ||||
| } | ||||
|  | ||||
| func TestTagSets_ContainsAll(t *testing.T) { | ||||
| 	t.Parallel() | ||||
|  | ||||
| 	ts := Set{ | ||||
| 		Tag{Name: "a", Value: "1"}, | ||||
| 		Tag{Name: "b", Value: "2"}, | ||||
| 	} | ||||
|  | ||||
| 	test := Set{Tag{Name: "a", Value: "1"}} | ||||
| 	require.True(t, ts.ContainsAll(test)) | ||||
| 	test = Set{Tag{Name: "a", Value: "1"}, Tag{Name: "b", Value: "2"}} | ||||
| 	require.True(t, ts.ContainsAll(test)) | ||||
| 	test = Set{Tag{Name: "a", Value: "1"}, Tag{Name: "b", Value: "2"}} | ||||
| 	require.True(t, ts.ContainsAll(test)) | ||||
|  | ||||
| 	test = Set{Tag{Name: "a", Value: "2"}, Tag{Name: "b", Value: "1"}} | ||||
| 	require.False(t, ts.ContainsAll(test)) | ||||
| 	test = Set{Tag{Name: "a", Value: "1"}, Tag{Name: "b", Value: "1"}} | ||||
| 	require.False(t, ts.ContainsAll(test)) | ||||
| 	test = Set{Tag{Name: "a", Value: "2"}, Tag{Name: "b", Value: "2"}} | ||||
| 	require.False(t, ts.ContainsAll(test)) | ||||
| } | ||||
|  | ||||
| func TestTagSets_String(t *testing.T) { | ||||
| 	t.Parallel() | ||||
|  | ||||
| 	ts := Set{ | ||||
| 		Tag{Name: "a", Value: "1"}, | ||||
| 		Tag{Name: "b", Value: "2"}, | ||||
| 	} | ||||
| 	assert.Equal(t, "a=1,b=2", ts.String(), `expected "a=1,b=2", got %q`, ts.String()) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user