41 lines
1.1 KiB
Go
41 lines
1.1 KiB
Go
// Copyright (C) MongoDB, Inc. 2024-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 bsoncoreutil
|
|
|
|
// Truncate truncates a given string for a certain width
|
|
func Truncate(str string, width int) string {
|
|
if width == 0 {
|
|
return ""
|
|
}
|
|
|
|
if len(str) <= width {
|
|
return str
|
|
}
|
|
|
|
// Truncate the byte slice of the string to the given width.
|
|
newStr := str[:width]
|
|
|
|
// Check if the last byte is at the beginning of a multi-byte character.
|
|
// If it is, then remove the last byte.
|
|
if newStr[len(newStr)-1]&0xC0 == 0xC0 {
|
|
return newStr[:len(newStr)-1]
|
|
}
|
|
|
|
// Check if the last byte is a multi-byte character
|
|
if newStr[len(newStr)-1]&0xC0 == 0x80 {
|
|
// If it is, step back until you we are at the start of a character
|
|
for i := len(newStr) - 1; i >= 0; i-- {
|
|
if newStr[i]&0xC0 == 0xC0 {
|
|
// Truncate at the end of the character before the character we stepped back to
|
|
return newStr[:i]
|
|
}
|
|
}
|
|
}
|
|
|
|
return newStr
|
|
}
|