ParseWithMetadata returns the tenant ID and optional metadata from orgID(s). Metadata is nil if no metadata is present. The orgID format is "tenantID:key=value" or "tenantID:k1=v1:k2=v2". Examples: - 123456 (tenantID=123456, metadata=nil) - 123456:a=b (tenantID=123456, metadat
(orgIDs string)
| 99 | // - 123456:a=b (tenantID=123456, metadata={a: b}) |
| 100 | // - 123456:a=b:c=d (tenantID=123456, metadata={a: b, c: d}) |
| 101 | func ParseWithMetadata(orgIDs string) (tenantID string, m Metadata, err error) { |
| 102 | orgID, remaining, hasMoreIDs := stringsCut(orgIDs, tenantIDsSeparator) |
| 103 | tenantID, metadataString := splitTenantAndMetadata(orgID) |
| 104 | if err := ValidTenantID(tenantID); err != nil { |
| 105 | return "", Metadata{}, err |
| 106 | } |
| 107 | var nextOrgID string |
| 108 | for hasMoreIDs { |
| 109 | nextOrgID, remaining, hasMoreIDs = stringsCut(remaining, tenantIDsSeparator) |
| 110 | // We can compare the entire orgID, no need to split into tenant/metadata. |
| 111 | // The orgID is already guaranteed to be valid. |
| 112 | if orgID != nextOrgID { |
| 113 | return "", Metadata{}, user.ErrTooManyOrgIDs |
| 114 | } |
| 115 | } |
| 116 | m, err = ParseMetadata(metadataString) |
| 117 | if err != nil { |
| 118 | return "", Metadata{}, err |
| 119 | } |
| 120 | return tenantID, m, nil |
| 121 | } |
| 122 | |
| 123 | type Resolver interface { |
| 124 | // TenantID returns exactly a single tenant ID from the context. It should be |
no test coverage detected