DecimalFormatter.mjs (7392B)
1 // generated by diplomat-tool 2 import { DataError } from "./DataError.mjs" 3 import { DataProvider } from "./DataProvider.mjs" 4 import { Decimal } from "./Decimal.mjs" 5 import { DecimalGroupingStrategy } from "./DecimalGroupingStrategy.mjs" 6 import { Locale } from "./Locale.mjs" 7 import wasm from "./diplomat-wasm.mjs"; 8 import * as diplomatRuntime from "./diplomat-runtime.mjs"; 9 10 11 /** 12 * An ICU4X Decimal Format object, capable of formatting a [`Decimal`] as a string. 13 * 14 * See the [Rust documentation for `DecimalFormatter`](https://docs.rs/icu/latest/icu/decimal/struct.DecimalFormatter.html) for more information. 15 */ 16 const DecimalFormatter_box_destroy_registry = new FinalizationRegistry((ptr) => { 17 wasm.icu4x_DecimalFormatter_destroy_mv1(ptr); 18 }); 19 20 export class DecimalFormatter { 21 // Internal ptr reference: 22 #ptr = null; 23 24 // Lifetimes are only to keep dependencies alive. 25 // Since JS won't garbage collect until there are no incoming edges. 26 #selfEdge = []; 27 28 #internalConstructor(symbol, ptr, selfEdge) { 29 if (symbol !== diplomatRuntime.internalConstructor) { 30 console.error("DecimalFormatter is an Opaque type. You cannot call its constructor."); 31 return; 32 } 33 this.#ptr = ptr; 34 this.#selfEdge = selfEdge; 35 36 // Are we being borrowed? If not, we can register. 37 if (this.#selfEdge.length === 0) { 38 DecimalFormatter_box_destroy_registry.register(this, this.#ptr); 39 } 40 41 return this; 42 } 43 get ffiValue() { 44 return this.#ptr; 45 } 46 47 48 /** 49 * Creates a new [`DecimalFormatter`], using compiled data 50 * 51 * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/decimal/struct.DecimalFormatter.html#method.try_new) for more information. 52 */ 53 static createWithGroupingStrategy(locale, groupingStrategy) { 54 let functionCleanupArena = new diplomatRuntime.CleanupArena(); 55 56 const diplomatReceive = new diplomatRuntime.DiplomatReceiveBuf(wasm, 5, 4, true); 57 58 59 const result = wasm.icu4x_DecimalFormatter_create_with_grouping_strategy_mv1(diplomatReceive.buffer, locale.ffiValue, ...diplomatRuntime.optionToArgsForCalling(groupingStrategy, 4, 4, (arrayBuffer, offset, jsValue) => [diplomatRuntime.writeToArrayBuffer(arrayBuffer, offset + 0, jsValue.ffiValue, Int32Array)])); 60 61 try { 62 if (!diplomatReceive.resultFlag) { 63 const cause = new DataError(diplomatRuntime.internalConstructor, diplomatRuntime.enumDiscriminant(wasm, diplomatReceive.buffer)); 64 throw new globalThis.Error('DataError: ' + cause.value, { cause }); 65 } 66 return new DecimalFormatter(diplomatRuntime.internalConstructor, diplomatRuntime.ptrRead(wasm, diplomatReceive.buffer), []); 67 } 68 69 finally { 70 functionCleanupArena.free(); 71 72 diplomatReceive.free(); 73 } 74 } 75 76 /** 77 * Creates a new [`DecimalFormatter`], using a particular data source. 78 * 79 * See the [Rust documentation for `try_new`](https://docs.rs/icu/latest/icu/decimal/struct.DecimalFormatter.html#method.try_new) for more information. 80 */ 81 static createWithGroupingStrategyAndProvider(provider, locale, groupingStrategy) { 82 let functionCleanupArena = new diplomatRuntime.CleanupArena(); 83 84 const diplomatReceive = new diplomatRuntime.DiplomatReceiveBuf(wasm, 5, 4, true); 85 86 87 const result = wasm.icu4x_DecimalFormatter_create_with_grouping_strategy_and_provider_mv1(diplomatReceive.buffer, provider.ffiValue, locale.ffiValue, ...diplomatRuntime.optionToArgsForCalling(groupingStrategy, 4, 4, (arrayBuffer, offset, jsValue) => [diplomatRuntime.writeToArrayBuffer(arrayBuffer, offset + 0, jsValue.ffiValue, Int32Array)])); 88 89 try { 90 if (!diplomatReceive.resultFlag) { 91 const cause = new DataError(diplomatRuntime.internalConstructor, diplomatRuntime.enumDiscriminant(wasm, diplomatReceive.buffer)); 92 throw new globalThis.Error('DataError: ' + cause.value, { cause }); 93 } 94 return new DecimalFormatter(diplomatRuntime.internalConstructor, diplomatRuntime.ptrRead(wasm, diplomatReceive.buffer), []); 95 } 96 97 finally { 98 functionCleanupArena.free(); 99 100 diplomatReceive.free(); 101 } 102 } 103 104 /** 105 * Creates a new [`DecimalFormatter`] from preconstructed locale data. 106 * 107 * See the [Rust documentation for `DecimalSymbolsV1`](https://docs.rs/icu/latest/icu/decimal/provider/struct.DecimalSymbolsV1.html) for more information. 108 */ 109 static createWithManualData(plusSignPrefix, plusSignSuffix, minusSignPrefix, minusSignSuffix, decimalSeparator, groupingSeparator, primaryGroupSize, secondaryGroupSize, minGroupSize, digits, groupingStrategy) { 110 let functionCleanupArena = new diplomatRuntime.CleanupArena(); 111 112 const plusSignPrefixSlice = diplomatRuntime.DiplomatBuf.str8(wasm, plusSignPrefix); 113 const plusSignSuffixSlice = diplomatRuntime.DiplomatBuf.str8(wasm, plusSignSuffix); 114 const minusSignPrefixSlice = diplomatRuntime.DiplomatBuf.str8(wasm, minusSignPrefix); 115 const minusSignSuffixSlice = diplomatRuntime.DiplomatBuf.str8(wasm, minusSignSuffix); 116 const decimalSeparatorSlice = diplomatRuntime.DiplomatBuf.str8(wasm, decimalSeparator); 117 const groupingSeparatorSlice = diplomatRuntime.DiplomatBuf.str8(wasm, groupingSeparator); 118 const digitsSlice = diplomatRuntime.DiplomatBuf.slice(wasm, digits, "u16"); 119 const diplomatReceive = new diplomatRuntime.DiplomatReceiveBuf(wasm, 5, 4, true); 120 121 122 const result = wasm.icu4x_DecimalFormatter_create_with_manual_data_mv1(diplomatReceive.buffer, ...plusSignPrefixSlice.splat(), ...plusSignSuffixSlice.splat(), ...minusSignPrefixSlice.splat(), ...minusSignSuffixSlice.splat(), ...decimalSeparatorSlice.splat(), ...groupingSeparatorSlice.splat(), primaryGroupSize, secondaryGroupSize, minGroupSize, ...digitsSlice.splat(), ...diplomatRuntime.optionToArgsForCalling(groupingStrategy, 4, 4, (arrayBuffer, offset, jsValue) => [diplomatRuntime.writeToArrayBuffer(arrayBuffer, offset + 0, jsValue.ffiValue, Int32Array)])); 123 124 try { 125 if (!diplomatReceive.resultFlag) { 126 const cause = new DataError(diplomatRuntime.internalConstructor, diplomatRuntime.enumDiscriminant(wasm, diplomatReceive.buffer)); 127 throw new globalThis.Error('DataError: ' + cause.value, { cause }); 128 } 129 return new DecimalFormatter(diplomatRuntime.internalConstructor, diplomatRuntime.ptrRead(wasm, diplomatReceive.buffer), []); 130 } 131 132 finally { 133 functionCleanupArena.free(); 134 135 diplomatReceive.free(); 136 } 137 } 138 139 /** 140 * Formats a [`Decimal`] to a string. 141 * 142 * See the [Rust documentation for `format`](https://docs.rs/icu/latest/icu/decimal/struct.DecimalFormatter.html#method.format) for more information. 143 */ 144 format(value) { 145 const write = new diplomatRuntime.DiplomatWriteBuf(wasm); 146 147 wasm.icu4x_DecimalFormatter_format_mv1(this.ffiValue, value.ffiValue, write.buffer); 148 149 try { 150 return write.readString8(); 151 } 152 153 finally { 154 write.free(); 155 } 156 } 157 158 constructor(symbol, ptr, selfEdge) { 159 return this.#internalConstructor(...arguments) 160 } 161 }