diff --git a/README.md b/README.md index c9ed066..97d8223 100644 --- a/README.md +++ b/README.md @@ -36,15 +36,19 @@ if err != nil { } ``` -Use `GetSegmentType(segment string)` to read the segment type from a segment value: -- `0` = *Core String* -- `1` = *Disclosed Vendors* -- `2` = *Allowed Vendors* -- `3` = *Publisher TC* +Use `GetSegmentType(segment string) (segmentType SegmentType, err error)` to read the segment type from a segment value: +- `SegmentTypeUndefined` = undefined +- `SegmentTypeCoreString` = *Core String* +- `SegmentTypeDisclosedVendors` = *Disclosed Vendors* +- `SegmentTypeAllowedVendors` = *Allowed Vendors* +- `SegmentTypePublisherTC` = *Publisher TC* -Use `GetVersion(s string)` to verify the cookie version from a TC String or a *Core String* segment value. This function also supports TCF V1.1 consent strings: -- `1` = TCF V1.1 -- `2` = TCF V2.0 +You can find more information about segment types [here](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#disclosed-vendors-oob). + +Use `GetVersion(s string) (version TcfVersion, err error)` to read the cookie version from a TC String or a *Core String* segment value. This function also supports TCF V1.1 consent strings: +- `TcfVersionUndefined` = undefined +- `TcfVersion1` = TCF V1.1 +- `TcfVersion2` = TCF V2.0 #### Example ``` diff --git a/constants.go b/constants.go new file mode 100644 index 0000000..a8377d6 --- /dev/null +++ b/constants.go @@ -0,0 +1,19 @@ +package iabtcfv2 + +type SegmentType int + +const ( + SegmentTypeUndefined SegmentType = -1 + SegmentTypeCoreString SegmentType = 0 + SegmentTypeDisclosedVendors SegmentType = 1 + SegmentTypeAllowedVendors SegmentType = 2 + SegmentTypePublisherTC SegmentType = 3 +) + +type TcfVersion int + +const ( + TcfVersionUndefined TcfVersion = -1 + TcfVersion1 TcfVersion = 1 + TcfVersion2 TcfVersion = 2 +) diff --git a/decode.go b/decode.go index b7f3417..1f6e456 100644 --- a/decode.go +++ b/decode.go @@ -6,9 +6,12 @@ import ( "strings" ) -// Decodes a string and returns the TCF version +// Decodes a string and returns the TcfVersion // It can also decode version from a TCF V1.1 consent string -func GetVersion(s string) (version int, err error) { +// - TcfVersionUndefined = -1 +// - TcfVersion1 = 1 +// - TcfVersion2 = 2 +func GetVersion(s string) (version TcfVersion, err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("%v", r) @@ -17,19 +20,20 @@ func GetVersion(s string) (version int, err error) { b, err := base64.RawURLEncoding.DecodeString(s) if err != nil { - return 0, err + return TcfVersionUndefined, err } var e = newTCEncoder(b) - return e.readInt(6), nil + return TcfVersion(e.readInt(6)), nil } -// Decodes a segment value and returns the type -// - 0 = Core String -// - 1 = Disclosed Vendors -// - 2 = Allowed Vendors -// - 3 = Publisher TC -func GetSegmentType(segment string) (segmentType int, err error) { +// Decodes a segment value and returns the SegmentType +// - SegmentTypeUndefined = -1 +// - SegmentTypeCoreString = 0 +// - SegmentTypeDisclosedVendors = 1 +// - SegmentTypeAllowedVendors = 2 +// - SegmentTypePublisherTC = 3 +func GetSegmentType(segment string) (segmentType SegmentType, err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("%v", r) @@ -38,11 +42,11 @@ func GetSegmentType(segment string) (segmentType int, err error) { b, err := base64.RawURLEncoding.DecodeString(segment) if err != nil { - return 0, err + return SegmentTypeUndefined, err } var e = newTCEncoder(b) - return e.readInt(3), nil + return SegmentType(e.readInt(3)), nil } // Decode a TC String and returns it as a TCData structure @@ -53,55 +57,55 @@ func GetSegmentType(segment string) (segmentType int, err error) { // - Publisher TC func Decode(tcString string) (t *TCData, err error) { t = &TCData{} - mapSegments := map[int]bool{} + mapSegments := map[SegmentType]bool{} for i, v := range strings.Split(tcString, ".") { segmentType, err := GetSegmentType(v) if err != nil { return nil, err } - if segmentType == disclosedVendorsType { - if mapSegments[disclosedVendorsType] == true { + if segmentType == SegmentTypeDisclosedVendors { + if mapSegments[SegmentTypeDisclosedVendors] == true { return nil, fmt.Errorf("duplicate Disclosed Vendors segment") } segment, err := DecodeDisclosedVendors(v) if err == nil { t.DisclosedVendors = segment - mapSegments[disclosedVendorsType] = true + mapSegments[SegmentTypeDisclosedVendors] = true } - } else if segmentType == allowedVendorsType { - if mapSegments[allowedVendorsType] == true { + } else if segmentType == SegmentTypeAllowedVendors { + if mapSegments[SegmentTypeAllowedVendors] == true { return nil, fmt.Errorf("duplicate Allowed Vendors segment") } segment, err := DecodeAllowedVendors(v) if err == nil { t.AllowedVendors = segment - mapSegments[allowedVendorsType] = true + mapSegments[SegmentTypeAllowedVendors] = true } - } else if segmentType == publicherTCType { - if mapSegments[publicherTCType] == true { + } else if segmentType == SegmentTypePublisherTC { + if mapSegments[SegmentTypePublisherTC] == true { return nil, fmt.Errorf("duplicate Publisher TC segment") } segment, err := DecodePublisherTC(v) if err == nil { t.PublisherTC = segment - mapSegments[publicherTCType] = true + mapSegments[SegmentTypePublisherTC] = true } } else { - if mapSegments[coreStringType] == true { + if mapSegments[SegmentTypeCoreString] == true { return nil, fmt.Errorf("duplicate Core String segment") } segment, err := DecodeCoreString(v) if err == nil { t.CoreString = segment if i == 0 { - mapSegments[coreStringType] = true + mapSegments[SegmentTypeCoreString] = true } } } } - if mapSegments[coreStringType] == false { + if mapSegments[SegmentTypeCoreString] == false { return nil, fmt.Errorf("invalid TC string") } diff --git a/decode_test.go b/decode_test.go index 0ff5f91..99d34dd 100644 --- a/decode_test.go +++ b/decode_test.go @@ -11,8 +11,8 @@ func TestGetVersion(t *testing.T) { return } - if version != 1 { - t.Errorf("Version should be 1") + if version != TcfVersion1 { + t.Errorf("Version should be %d", TcfVersion1) } version, err = GetVersion("COxR03kOxR1CqBcABCENAgCMAP_AAH_AAAqIF3EXySoGY2thI2YVFxBEIYwfJxyigMgChgQIsSwNQIeFLBoGLiAAHBGYJAQAGBAEEACBAQIkHGBMCQAAgAgBiRCMQEGMCzNIBIBAggEbY0FACCVmHkHSmZCY7064O__QLuIJEFQMAkSBAIACLECIQwAQDiAAAYAlAAABAhIaAAgIWBQEeAAAACAwAAgAAABBAAACAAQAAICIAAABAAAgAiAQAAAAGgIQAACBABACRIAAAEANCAAgiCEAQg4EAo4AAA") @@ -21,8 +21,8 @@ func TestGetVersion(t *testing.T) { return } - if version != 2 { - t.Errorf("Version should be 2") + if version != TcfVersion2 { + t.Errorf("Version should be %d", TcfVersion2) } } @@ -35,8 +35,8 @@ func TestGetSegmentType(t *testing.T) { return } - if segType != 1 { - t.Errorf("Segment type should be 1") + if segType != SegmentTypeDisclosedVendors { + t.Errorf("Segment type should be %d", SegmentTypeDisclosedVendors) } } @@ -114,8 +114,8 @@ func TestDecodeCoreString(t *testing.T) { return } - if segType != 0 { - t.Errorf("Segment type should be 0") + if segType != SegmentTypeCoreString { + t.Errorf("Segment type should be %d", SegmentTypeCoreString) return } @@ -145,8 +145,8 @@ func TestDecodeDisclosedVendors(t *testing.T) { return } - if segType != 1 { - t.Errorf("Segment type should be 1") + if segType != SegmentTypeDisclosedVendors { + t.Errorf("Segment type should be %d", SegmentTypeDisclosedVendors) return } @@ -186,8 +186,8 @@ func TestDecodeAllowedVendors(t *testing.T) { return } - if segType != 2 { - t.Errorf("Segment type should be 2") + if segType != SegmentTypeAllowedVendors { + t.Errorf("Segment type should be %d", SegmentTypeAllowedVendors) return } @@ -227,8 +227,8 @@ func TestDecodePublisherTC(t *testing.T) { return } - if segType != 3 { - t.Errorf("Segment type should be 3") + if segType != SegmentTypePublisherTC { + t.Errorf("Segment type should be %d", SegmentTypePublisherTC) return } diff --git a/tcdata.go b/tcdata.go index 0e363eb..e448a7c 100644 --- a/tcdata.go +++ b/tcdata.go @@ -2,13 +2,6 @@ package iabtcfv2 import "strings" -const ( - coreStringType = 0 - disclosedVendorsType = 1 - allowedVendorsType = 2 - publicherTCType = 3 -) - type TCData struct { CoreString *CoreString DisclosedVendors *DisclosedVendors