Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions Generator/PhpWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ public void WritePhpTypes(IEnumerable<Type> 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);

Expand All @@ -75,6 +77,103 @@ public void WritePhpTypes(IEnumerable<Type> 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)
Expand Down
144 changes: 122 additions & 22 deletions src/Factory/DataValueFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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<int, array{Language: Language, Values: string[]}> $values Language/value entries.
* @return DataValue
*/
public static function multilingualCollection(array $values) : DataValue {
return DataValue::create()
->setType(DataValueDataValueTypes::MultilingualCollection)
Expand All @@ -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)
Expand All @@ -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) {
Expand Down
37 changes: 37 additions & 0 deletions src/Models/AbandonedCartTriggerResultTriggerResultResponse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php declare(strict_types=1);

namespace Relewise\Models;

class AbandonedCartTriggerResultTriggerResultResponse extends TimedResponse
{
public string $typeDefinition = "Relewise.Client.Responses.Triggers.TriggerResultResponse`1[[Relewise.Client.Responses.Triggers.Results.AbandonedCartTriggerResult, Relewise.Client, Version=1.280.0.0, Culture=neutral, PublicKeyToken=null]], Relewise.Client";
public AbandonedCartTriggerResult $result;

public static function create() : AbandonedCartTriggerResultTriggerResultResponse
{
$result = new AbandonedCartTriggerResultTriggerResultResponse();
return $result;
}

public static function hydrate(array $arr) : AbandonedCartTriggerResultTriggerResultResponse
{
$result = TimedResponse::hydrateBase(new AbandonedCartTriggerResultTriggerResultResponse(), $arr);
if (array_key_exists("result", $arr))
{
$result->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;
}
}
Loading