diff --git a/Generator/PhpWriter.cs b/Generator/PhpWriter.cs index 188fa071..a758e8f2 100644 --- a/Generator/PhpWriter.cs +++ b/Generator/PhpWriter.cs @@ -59,6 +59,8 @@ public void WritePhpTypes(IEnumerable types) if ((type.IsGenericTypeDefinition || type.IsGenericTypeParameter || typeName.Contains("d__"))) continue; + DiscoverReferencedTypesFromSignatures(type); + using StreamWriter streamWriter = File.CreateText($"{BasePath}/{Constants.GenerationFolderPath}/{typeName}.php"); using var writer = new IndentedTextWriter(streamWriter); @@ -75,6 +77,103 @@ public void WritePhpTypes(IEnumerable types) } } + private void DiscoverReferencedTypesFromSignatures(Type type) + { + const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly; + + foreach (var constructor in type.GetConstructors(flags)) + { + foreach (var parameter in constructor.GetParameters()) + { + DiscoverReferencedType(parameter.ParameterType); + } + } + + foreach (var method in type.GetMethods(flags)) + { + // Keep property/event accessors out of traversal, but include conversion operators. + if (method.IsSpecialName && method.Name is not "op_Implicit" and not "op_Explicit") + { + continue; + } + if (method.IsGenericMethodDefinition || method.ContainsGenericParameters) + { + continue; + } + + DiscoverReferencedType(method.ReturnType); + + foreach (var parameter in method.GetParameters()) + { + DiscoverReferencedType(parameter.ParameterType); + } + } + } + + private void DiscoverReferencedType(Type type) + { + if (type == typeof(void)) + { + return; + } + if (type.ContainsGenericParameters) + { + return; + } + + if (type.IsByRef || type.IsPointer) + { + if (type.GetElementType() is { } elementType) + { + DiscoverReferencedType(elementType); + } + return; + } + + if (type.IsArray) + { + if (type.GetElementType() is { } elementType) + { + DiscoverReferencedType(elementType); + } + return; + } + + if (type.IsGenericType || type.IsGenericTypeDefinition) + { + foreach (var genericArgument in type.GetGenericArguments()) + { + if (genericArgument.IsGenericParameter) + { + foreach (var constraint in genericArgument.GetGenericParameterConstraints()) + { + DiscoverReferencedType(constraint); + } + } + else + { + DiscoverReferencedType(genericArgument); + } + } + } + + if (type.IsGenericParameter) + { + foreach (var constraint in type.GetGenericParameterConstraints()) + { + DiscoverReferencedType(constraint); + } + return; + } + + if (type.IsGenericTypeDefinition || type.Assembly != Assembly) + { + return; + } + + PhpTypeName(type); + } + public string PhpTypeName(Type type) => _phpTypeResolver.ResolveType(type); public string PhpTypeName(PropertyInfo property) diff --git a/src/Factory/DataValueFactory.php b/src/Factory/DataValueFactory.php index 740dc484..bd2d9dc8 100644 --- a/src/Factory/DataValueFactory.php +++ b/src/Factory/DataValueFactory.php @@ -9,39 +9,70 @@ use Relewise\Models\MultilingualValue; class DataValueFactory { - /** This method takes a string. */ + /** + * Creates a string DataValue. + * + * @param string $value String value. + * @return DataValue + */ public static function string(string $value) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::String) ->setValue($value); } - /** This method takes a float. */ + /** + * Creates a floating-point DataValue. + * + * @param float $value Floating-point value. + * @return DataValue + */ public static function float(float $value) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::Double) ->setValue($value); } - /** This method takes a bool. */ + /** + * Creates a boolean DataValue. + * + * @param bool $value Boolean value. + * @return DataValue + */ public static function boolean(bool $value) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::Boolean) ->setValue($value); } - /** This method takes a Money object. */ + /** + * Creates a money DataValue. + * + * @param Money $value Money value. + * @return DataValue + */ public static function money(Money $value) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::Money) ->setValue($value); } - /** This method takes any number of Money objects. */ + /** + * Creates a multi-currency DataValue from multiple Money values. + * + * @param Money ...$moneyValues Money values. + * @return DataValue + */ public static function multiCurrencyFromMultipleMoney(Money ... $moneyValues) : DataValue { return DataValueFactory::multiCurrencyFromMoneyArray($moneyValues); } - /** This method takes an array of Money objects. */ + + /** + * Creates a multi-currency DataValue from an array of Money values. + * + * @param Money[] $moneyValues Money values. + * @return DataValue + */ public static function multiCurrencyFromMoneyArray(array $moneyValues) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::MultiCurrency) @@ -53,11 +84,22 @@ public static function multiCurrencyFromMoneyArray(array $moneyValues) : DataVal ); } - /** This method takes any number of strings. */ + /** + * Creates a string-list DataValue from multiple strings. + * + * @param string ...$values String values. + * @return DataValue + */ public static function stringList(string ... $values) : DataValue { return DataValueFactory::stringListFromArray($values); } - /** This method takes an array of strings. */ + + /** + * Creates a string-list DataValue from an array of strings. + * + * @param string[] $values String values. + * @return DataValue + */ public static function stringListFromArray(array $values) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::StringList) @@ -69,11 +111,22 @@ public static function stringListFromArray(array $values) : DataValue { ); } - /** This method takes any number of floats. */ + /** + * Creates a float-list DataValue from multiple floating-point values. + * + * @param float ...$values Floating-point values. + * @return DataValue + */ public static function floatList(float ... $values) : DataValue { return DataValueFactory::floatListFromArray($values); } - /** This method takes an array of floats. */ + + /** + * Creates a float-list DataValue from an array of floating-point values. + * + * @param float[] $values Floating-point values. + * @return DataValue + */ public static function floatListFromArray(array $values) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::DoubleList) @@ -85,11 +138,22 @@ public static function floatListFromArray(array $values) : DataValue { ); } - /** This method takes any number of bools. */ + /** + * Creates a boolean-list DataValue from multiple boolean values. + * + * @param bool ...$values Boolean values. + * @return DataValue + */ public static function booleanList(bool ... $values) : DataValue { return DataValueFactory::booleanListFromArray($values); } - /** This method takes an array of bools. */ + + /** + * Creates a boolean-list DataValue from an array of booleans. + * + * @param bool[] $values Boolean values. + * @return DataValue + */ public static function booleanListFromArray(array $values) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::BooleanList) @@ -101,7 +165,12 @@ public static function booleanListFromArray(array $values) : DataValue { ); } - /** This method takes a Multilingual. */ + /** + * Creates a multilingual DataValue. + * + * @param Multilingual $value Multilingual value. + * @return DataValue + */ public static function multilingual(Multilingual $value) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::Multilingual) @@ -113,11 +182,24 @@ public static function multilingual(Multilingual $value) : DataValue { ); } - /** This method takes a Language and any number of strings. */ + /** + * Creates a multilingual collection DataValue for a single language from multiple strings. + * + * @param Language $language Language for all values. + * @param string ...$values String values for the language. + * @return DataValue + */ public static function multilingualCollectionWithSingleLanguage(Language $language, string ... $values) : DataValue { return DataValueFactory::multilingualCollectionWithSingleLanguageFromArray($language, $values); } - /** This method takes a Language and an array of strings. */ + + /** + * Creates a multilingual collection DataValue for a single language from an array of strings. + * + * @param Language $language Language for all values. + * @param string[] $values String values for the language. + * @return DataValue + */ public static function multilingualCollectionWithSingleLanguageFromArray(Language $language, array $values) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::MultilingualCollection) @@ -133,10 +215,12 @@ public static function multilingualCollectionWithSingleLanguageFromArray(Languag )); } - /** This method takes an array of arrays with two keys "Language" being a Language and "Values" being an array of strings. - * Example: - * array(array("Language" => Language::create("da"), "Values" => array("Hallo")), array("Language" => Language::create("en"), "Values" => array("Hello"))) - */ + /** + * Creates a multilingual collection DataValue. + * + * @param array $values Language/value entries. + * @return DataValue + */ public static function multilingualCollection(array $values) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::MultilingualCollection) @@ -147,7 +231,12 @@ public static function multilingualCollection(array $values) : DataValue { )); } - /** This method takes an array of key value pairs. */ + /** + * Creates an object DataValue from arbitrary data. + * + * @param mixed $data Data payload, typically an associative array. + * @return DataValue + */ public static function object(mixed $data) : DataValue { return DataValue::create() ->setType(DataValueDataValueTypes::Object) @@ -158,11 +247,22 @@ public static function object(mixed $data) : DataValue { )); } - /** This method takes multiple arrays within, each with key value pairs. */ + /** + * Creates an object-list DataValue from multiple object payloads. + * + * @param mixed ...$objects Object payloads. + * @return DataValue + */ public static function objectList(mixed ... $objects) : DataValue { return DataValueFactory::objectListFromArray($objects); } - /** This method takes an arrray with multiple arrays within, each with key value pairs. */ + + /** + * Creates an object-list DataValue from an array of object payloads. + * + * @param mixed[] $objects Object payloads. + * @return DataValue + */ public static function objectListFromArray(array $objects) : DataValue { $values = array(); foreach ($objects as $object) { diff --git a/src/Models/AbandonedCartTriggerResultTriggerResultResponse.php b/src/Models/AbandonedCartTriggerResultTriggerResultResponse.php new file mode 100644 index 00000000..e4170060 --- /dev/null +++ b/src/Models/AbandonedCartTriggerResultTriggerResultResponse.php @@ -0,0 +1,37 @@ +result = AbandonedCartTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(AbandonedCartTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +} diff --git a/src/Models/AbandonedSearchTriggerResultTriggerResultResponse.php b/src/Models/AbandonedSearchTriggerResultTriggerResultResponse.php new file mode 100644 index 00000000..84d4936c --- /dev/null +++ b/src/Models/AbandonedSearchTriggerResultTriggerResultResponse.php @@ -0,0 +1,37 @@ +result = AbandonedSearchTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(AbandonedSearchTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +} diff --git a/src/Models/ContentCategoryInterestTriggerResultTriggerResultResponse.php b/src/Models/ContentCategoryInterestTriggerResultTriggerResultResponse.php new file mode 100644 index 00000000..4cbd65f9 --- /dev/null +++ b/src/Models/ContentCategoryInterestTriggerResultTriggerResultResponse.php @@ -0,0 +1,37 @@ +result = ContentCategoryInterestTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(ContentCategoryInterestTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +} diff --git a/src/Models/ContentThenSortBySpecification.php b/src/Models/ContentThenSortBySpecification.php new file mode 100644 index 00000000..21bab2be --- /dev/null +++ b/src/Models/ContentThenSortBySpecification.php @@ -0,0 +1,18 @@ +data = $data; + return $result; + } + + public static function hydrate(array $arr) : DataObject + { + $result = new DataObject(); + if (array_key_exists("data", $arr)) + { + $result->data = array(); + foreach($arr["data"] as $key => $value) + { + $result->data[$key] = DataValue::hydrate($value); + } + } + return $result; + } + + function addToData(string $key, DataValue $value) + { + if (!isset($this->data)) + { + $this->data = array(); + } + $this->data[$key] = $value; + return $this; + } + + /** @param array $data associative array. */ + function setDataFromAssociativeArray(array $data) + { + $this->data = $data; + return $this; + } +} diff --git a/src/Models/MultilingualCollection.php b/src/Models/MultilingualCollection.php new file mode 100644 index 00000000..58b26dab --- /dev/null +++ b/src/Models/MultilingualCollection.php @@ -0,0 +1,52 @@ +values = $collections; + return $result; + } + + public static function hydrate(array $arr) : MultilingualCollection + { + $result = new MultilingualCollection(); + if (array_key_exists("values", $arr)) + { + $result->values = array(); + foreach($arr["values"] as &$value) + { + array_push($result->values, MultilingualCollectionValue::hydrate($value)); + } + } + return $result; + } + + function setValues(MultilingualCollectionValue ... $values) + { + $this->values = $values; + return $this; + } + + /** @param MultilingualCollectionValue[] $values new value. */ + function setValuesFromArray(array $values) + { + $this->values = $values; + return $this; + } + + function addToValues(MultilingualCollectionValue $values) + { + if (!isset($this->values)) + { + $this->values = array(); + } + array_push($this->values, $values); + return $this; + } +} diff --git a/src/Models/MultilingualCollectionValue.php b/src/Models/MultilingualCollectionValue.php new file mode 100644 index 00000000..8d94ba5e --- /dev/null +++ b/src/Models/MultilingualCollectionValue.php @@ -0,0 +1,64 @@ +language = $language; + $result->values = $values; + return $result; + } + + public static function hydrate(array $arr) : MultilingualCollectionValue + { + $result = new MultilingualCollectionValue(); + if (array_key_exists("language", $arr)) + { + $result->language = Language::hydrate($arr["language"]); + } + if (array_key_exists("values", $arr)) + { + $result->values = array(); + foreach($arr["values"] as &$value) + { + array_push($result->values, $value); + } + } + return $result; + } + + function setLanguage(Language $language) + { + $this->language = $language; + return $this; + } + + function setValues(string ... $values) + { + $this->values = $values; + return $this; + } + + /** @param string[] $values new value. */ + function setValuesFromArray(array $values) + { + $this->values = $values; + return $this; + } + + function addToValues(string $values) + { + if (!isset($this->values)) + { + $this->values = array(); + } + array_push($this->values, $values); + return $this; + } +} diff --git a/src/Models/ProductCategoryInterestTriggerResultTriggerResultResponse.php b/src/Models/ProductCategoryInterestTriggerResultTriggerResultResponse.php new file mode 100644 index 00000000..d2ab1ebf --- /dev/null +++ b/src/Models/ProductCategoryInterestTriggerResultTriggerResultResponse.php @@ -0,0 +1,37 @@ +result = ProductCategoryInterestTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(ProductCategoryInterestTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +} diff --git a/src/Models/ProductCategoryThenSortBySpecification.php b/src/Models/ProductCategoryThenSortBySpecification.php new file mode 100644 index 00000000..eb447685 --- /dev/null +++ b/src/Models/ProductCategoryThenSortBySpecification.php @@ -0,0 +1,18 @@ +result = ProductChangeTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(ProductChangeTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +} diff --git a/src/Models/ProductInterestTriggerResultTriggerResultResponse.php b/src/Models/ProductInterestTriggerResultTriggerResultResponse.php new file mode 100644 index 00000000..12d3bafa --- /dev/null +++ b/src/Models/ProductInterestTriggerResultTriggerResultResponse.php @@ -0,0 +1,37 @@ +result = ProductInterestTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(ProductInterestTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +} diff --git a/src/Models/ProductThenSortBySpecification.php b/src/Models/ProductThenSortBySpecification.php new file mode 100644 index 00000000..964d99d5 --- /dev/null +++ b/src/Models/ProductThenSortBySpecification.php @@ -0,0 +1,18 @@ +result = UserActivityTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(UserActivityTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +} diff --git a/src/Models/VariantChangeTriggerResultTriggerResultResponse.php b/src/Models/VariantChangeTriggerResultTriggerResultResponse.php new file mode 100644 index 00000000..acf3060b --- /dev/null +++ b/src/Models/VariantChangeTriggerResultTriggerResultResponse.php @@ -0,0 +1,37 @@ +result = VariantChangeTriggerResult::hydrate($arr["result"]); + } + return $result; + } + + function setResult(VariantChangeTriggerResult $result) + { + $this->result = $result; + return $this; + } + + function setStatistics(Statistics $statistics) + { + $this->statistics = $statistics; + return $this; + } +}