| 1857 | } |
| 1858 | |
| 1859 | func parseFTInfo(data map[string]interface{}) (FTInfoResult, error) { |
| 1860 | var ftInfo FTInfoResult |
| 1861 | |
| 1862 | // Parse Index Errors - handle both RESP2 (array) and RESP3 (map) formats |
| 1863 | if indexErrors, ok := data["Index Errors"].([]interface{}); ok { |
| 1864 | // RESP2 format: array with key-value pairs |
| 1865 | ftInfo.IndexErrors = IndexErrors{ |
| 1866 | IndexingFailures: internal.ToInteger(indexErrors[1]), |
| 1867 | LastIndexingError: internal.ToString(indexErrors[3]), |
| 1868 | LastIndexingErrorKey: internal.ToString(indexErrors[5]), |
| 1869 | } |
| 1870 | } else if indexErrors, ok := data["Index Errors"].(map[interface{}]interface{}); ok { |
| 1871 | // RESP3 format: map |
| 1872 | ftInfo.IndexErrors = parseIndexErrorsRESP3(indexErrors) |
| 1873 | } |
| 1874 | |
| 1875 | if attributes, ok := data["attributes"].([]interface{}); ok { |
| 1876 | for _, attr := range attributes { |
| 1877 | att := FTAttribute{} |
| 1878 | // Handle RESP2 format: attribute is []interface{} |
| 1879 | if attrSlice, ok := attr.([]interface{}); ok { |
| 1880 | attrLen := len(attrSlice) |
| 1881 | for i := 0; i < attrLen; i++ { |
| 1882 | if internal.ToLower(internal.ToString(attrSlice[i])) == "attribute" && i+1 < attrLen { |
| 1883 | att.Attribute = internal.ToString(attrSlice[i+1]) |
| 1884 | i++ |
| 1885 | continue |
| 1886 | } |
| 1887 | if internal.ToLower(internal.ToString(attrSlice[i])) == "identifier" && i+1 < attrLen { |
| 1888 | att.Identifier = internal.ToString(attrSlice[i+1]) |
| 1889 | i++ |
| 1890 | continue |
| 1891 | } |
| 1892 | if internal.ToLower(internal.ToString(attrSlice[i])) == "type" && i+1 < attrLen { |
| 1893 | att.Type = internal.ToString(attrSlice[i+1]) |
| 1894 | i++ |
| 1895 | continue |
| 1896 | } |
| 1897 | if internal.ToLower(internal.ToString(attrSlice[i])) == "weight" && i+1 < attrLen { |
| 1898 | att.Weight = internal.ToFloat(attrSlice[i+1]) |
| 1899 | i++ |
| 1900 | continue |
| 1901 | } |
| 1902 | if internal.ToLower(internal.ToString(attrSlice[i])) == "nostem" { |
| 1903 | att.NoStem = true |
| 1904 | continue |
| 1905 | } |
| 1906 | if internal.ToLower(internal.ToString(attrSlice[i])) == "sortable" { |
| 1907 | att.Sortable = true |
| 1908 | continue |
| 1909 | } |
| 1910 | if internal.ToLower(internal.ToString(attrSlice[i])) == "noindex" { |
| 1911 | att.NoIndex = true |
| 1912 | continue |
| 1913 | } |
| 1914 | if internal.ToLower(internal.ToString(attrSlice[i])) == "unf" { |
| 1915 | att.UNF = true |
| 1916 | continue |