gitlab.com/evatix-go/core@v1.3.55/coredata/corejson/newResultCreator.go (about)

     1  package corejson
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  
     7  	"gitlab.com/evatix-go/core/constants"
     8  	"gitlab.com/evatix-go/core/coredata"
     9  	"gitlab.com/evatix-go/core/errcore"
    10  	"gitlab.com/evatix-go/core/internal/reflectinternal"
    11  )
    12  
    13  type newResultCreator struct{}
    14  
    15  // UnmarshalUsingBytes
    16  //
    17  //  Aka. alias for DeserializeUsingBytes
    18  //
    19  //  Should be used when Result itself is Serialized
    20  //  and save to somewhere and then unmarshal or deserialize
    21  func (it newResultCreator) UnmarshalUsingBytes(
    22  	deserializingBytes []byte,
    23  ) *Result {
    24  	return it.DeserializeUsingBytes(deserializingBytes)
    25  }
    26  
    27  // DeserializeUsingBytes
    28  //
    29  //  Should be used when Result itself is Serialized
    30  //  and save to somewhere and then unmarshal or deserialize
    31  func (it newResultCreator) DeserializeUsingBytes(
    32  	deserializingBytes []byte,
    33  ) *Result {
    34  	empty := it.TypeName(resultTypeName)
    35  
    36  	err := Deserialize.
    37  		UsingBytes(deserializingBytes, empty)
    38  
    39  	if err == nil {
    40  		return empty
    41  	}
    42  
    43  	empty.Error = err
    44  
    45  	return empty
    46  }
    47  
    48  func (it newResultCreator) DeserializeUsingResult(
    49  	jsonResult *Result,
    50  ) *Result {
    51  	if jsonResult.HasIssuesOrEmpty() {
    52  		return it.ErrorPtr(jsonResult.Error)
    53  	}
    54  
    55  	empty := it.TypeName(resultTypeName)
    56  
    57  	err := Deserialize.
    58  		UsingBytes(
    59  			jsonResult.SafeBytes(),
    60  			empty)
    61  
    62  	if err == nil {
    63  		return empty
    64  	}
    65  
    66  	empty.Error = err
    67  
    68  	return empty
    69  }
    70  
    71  func (it newResultCreator) UsingBytes(
    72  	jsonBytes []byte,
    73  ) Result {
    74  	return Result{
    75  		Bytes: jsonBytes,
    76  	}
    77  }
    78  
    79  func (it newResultCreator) UsingBytesType(
    80  	jsonBytes []byte,
    81  	typeName string,
    82  ) Result {
    83  	return Result{
    84  		Bytes:    jsonBytes,
    85  		TypeName: typeName,
    86  	}
    87  }
    88  
    89  func (it newResultCreator) UsingBytesTypePtr(
    90  	jsonBytes []byte,
    91  	typeName string,
    92  ) *Result {
    93  	return &Result{
    94  		Bytes:    jsonBytes,
    95  		TypeName: typeName,
    96  	}
    97  }
    98  
    99  func (it newResultCreator) UsingTypeBytesPtr(
   100  	typeName string,
   101  	jsonBytes []byte,
   102  ) *Result {
   103  	return &Result{
   104  		Bytes:    jsonBytes,
   105  		TypeName: typeName,
   106  	}
   107  }
   108  
   109  func (it newResultCreator) UsingBytesPtr(
   110  	jsonBytes *[]byte,
   111  ) *Result {
   112  	if jsonBytes == nil || *jsonBytes == nil {
   113  		return &Result{}
   114  	}
   115  
   116  	return &Result{
   117  		Bytes: *jsonBytes,
   118  	}
   119  }
   120  
   121  func (it newResultCreator) UsingBytesPtrErrPtr(
   122  	jsonBytes *[]byte, err error, typeName string,
   123  ) *Result {
   124  	if jsonBytes == nil || *jsonBytes == nil {
   125  		return &Result{
   126  			Error:    err,
   127  			TypeName: typeName,
   128  		}
   129  	}
   130  
   131  	return &Result{
   132  		Bytes:    *jsonBytes,
   133  		Error:    err,
   134  		TypeName: typeName,
   135  	}
   136  }
   137  
   138  func (it newResultCreator) UsingBytesErrPtr(
   139  	jsonBytes []byte, err error, typeName string,
   140  ) *Result {
   141  	if len(jsonBytes) == 0 {
   142  		return &Result{
   143  			Bytes:    []byte{},
   144  			Error:    err,
   145  			TypeName: typeName,
   146  		}
   147  	}
   148  
   149  	return &Result{
   150  		Bytes:    jsonBytes,
   151  		Error:    err,
   152  		TypeName: typeName,
   153  	}
   154  }
   155  
   156  func (it newResultCreator) PtrUsingStringPtr(
   157  	jsonStringPtr *string,
   158  	typeName string,
   159  ) *Result {
   160  	if jsonStringPtr == nil {
   161  		return it.PtrUsingBytesPtr(
   162  			nil,
   163  			errors.New("json string ptr is nil cannot process further"),
   164  			typeName)
   165  	}
   166  
   167  	return &Result{
   168  		Bytes:    []byte(*jsonStringPtr),
   169  		TypeName: typeName,
   170  	}
   171  }
   172  
   173  func (it newResultCreator) UsingErrorStringPtr(
   174  	err error,
   175  	jsonStringPtr *string,
   176  	typeName string,
   177  ) *Result {
   178  	var errMsg string
   179  	if err != nil {
   180  		errMsg = err.Error()
   181  	}
   182  
   183  	if jsonStringPtr == nil {
   184  		return it.PtrUsingBytesPtr(
   185  			nil,
   186  			errors.New("json string ptr is nil cannot process further"+errMsg),
   187  			typeName)
   188  	}
   189  
   190  	return &Result{
   191  		Bytes:    []byte(*jsonStringPtr),
   192  		Error:    err,
   193  		TypeName: typeName,
   194  	}
   195  }
   196  
   197  func (it newResultCreator) Ptr(
   198  	jsonBytes []byte,
   199  	err error,
   200  	typeName string,
   201  ) *Result {
   202  	return &Result{
   203  		Bytes:    jsonBytes,
   204  		Error:    err,
   205  		TypeName: typeName,
   206  	}
   207  }
   208  
   209  func (it newResultCreator) UsingJsonBytesTypeError(
   210  	jsonBytes []byte,
   211  	err error,
   212  	typeName string,
   213  ) *Result {
   214  	return &Result{
   215  		Bytes:    jsonBytes,
   216  		Error:    err,
   217  		TypeName: typeName,
   218  	}
   219  }
   220  
   221  func (it newResultCreator) UsingJsonBytesError(
   222  	jsonBytes []byte,
   223  	err error,
   224  ) *Result {
   225  	return &Result{
   226  		Bytes:    jsonBytes,
   227  		Error:    err,
   228  		TypeName: constants.UnknownType,
   229  	}
   230  }
   231  
   232  func (it newResultCreator) UsingTypePlusString(
   233  	typeName string,
   234  	jsonString string,
   235  ) *Result {
   236  	return &Result{
   237  		Bytes:    []byte(jsonString),
   238  		TypeName: typeName,
   239  	}
   240  }
   241  
   242  func (it newResultCreator) UsingTypePlusStringPtr(
   243  	typeName string,
   244  	jsonStringPtr *string,
   245  ) *Result {
   246  	if jsonStringPtr == nil || len(*jsonStringPtr) == 0 {
   247  		return &Result{
   248  			Bytes: []byte{},
   249  		}
   250  	}
   251  
   252  	return &Result{
   253  		Bytes:    []byte(*jsonStringPtr),
   254  		TypeName: typeName,
   255  	}
   256  }
   257  
   258  func (it newResultCreator) UsingStringWithType(
   259  	jsonString string,
   260  	typeName string,
   261  ) *Result {
   262  	return &Result{
   263  		Bytes:    []byte(jsonString),
   264  		TypeName: typeName,
   265  	}
   266  }
   267  
   268  func (it newResultCreator) UsingString(
   269  	jsonString string,
   270  ) *Result {
   271  	return &Result{
   272  		Bytes:    []byte(jsonString),
   273  		TypeName: constants.UnknownStringType,
   274  	}
   275  }
   276  
   277  func (it newResultCreator) UsingStringPtr(
   278  	jsonStringPtr *string,
   279  ) *Result {
   280  	if jsonStringPtr == nil || len(*jsonStringPtr) == 0 {
   281  		return &Result{
   282  			Bytes: []byte{},
   283  		}
   284  	}
   285  
   286  	return &Result{
   287  		Bytes:    []byte(*jsonStringPtr),
   288  		TypeName: constants.UnknownStringType,
   289  	}
   290  }
   291  
   292  func (it newResultCreator) CreatePtr(
   293  	jsonBytes []byte,
   294  	err error,
   295  	typeName string,
   296  ) *Result {
   297  	return &Result{
   298  		Bytes:    jsonBytes,
   299  		Error:    err,
   300  		TypeName: typeName,
   301  	}
   302  }
   303  
   304  func (it newResultCreator) NonPtr(
   305  	jsonBytes []byte,
   306  	err error,
   307  	typeName string,
   308  ) Result {
   309  	return Result{
   310  		Bytes:    jsonBytes,
   311  		Error:    err,
   312  		TypeName: typeName,
   313  	}
   314  }
   315  
   316  func (it newResultCreator) Create(
   317  	jsonBytes []byte,
   318  	err error,
   319  	typeName string,
   320  ) Result {
   321  	return Result{
   322  		Bytes:    jsonBytes,
   323  		Error:    err,
   324  		TypeName: typeName,
   325  	}
   326  }
   327  
   328  func (it newResultCreator) PtrUsingBytesPtr(
   329  	jsonBytes *[]byte,
   330  	err error,
   331  	typeName string,
   332  ) *Result {
   333  	if err != nil {
   334  		return &Result{
   335  			Bytes:    []byte{},
   336  			Error:    err,
   337  			TypeName: typeName,
   338  		}
   339  	}
   340  
   341  	if jsonBytes == nil {
   342  		return &Result{
   343  			Bytes:    []byte{},
   344  			Error:    nil,
   345  			TypeName: typeName,
   346  		}
   347  	}
   348  
   349  	return &Result{
   350  		Bytes:    *jsonBytes,
   351  		Error:    nil,
   352  		TypeName: typeName,
   353  	}
   354  }
   355  
   356  // CastingAny
   357  //
   358  //  if already in JsonResult then returns it
   359  func (it newResultCreator) CastingAny(
   360  	castingAnyToJsonResultPtr interface{},
   361  ) *Result {
   362  	return AnyTo.SerializedJsonResult(castingAnyToJsonResultPtr)
   363  }
   364  
   365  func (it newResultCreator) Any(
   366  	anyItem interface{},
   367  ) Result {
   368  	jsonBytes, err := json.Marshal(anyItem)
   369  	typeName := reflectinternal.TypeName(anyItem)
   370  
   371  	if err != nil {
   372  		return Result{
   373  			Bytes: jsonBytes,
   374  			Error: errcore.MarshallingFailedType.Error(
   375  				err.Error(),
   376  				typeName),
   377  			TypeName: typeName,
   378  		}
   379  	}
   380  
   381  	return Result{
   382  		Bytes:    jsonBytes,
   383  		Error:    err,
   384  		TypeName: typeName,
   385  	}
   386  }
   387  
   388  func (it newResultCreator) AnyPtr(
   389  	anyItem interface{},
   390  ) *Result {
   391  	jsonBytes, err := json.Marshal(anyItem)
   392  	typeName := reflectinternal.TypeName(anyItem)
   393  
   394  	if err != nil {
   395  		return &Result{
   396  			Bytes: jsonBytes,
   397  			Error: errcore.MarshallingFailedType.Error(
   398  				err.Error(),
   399  				typeName),
   400  			TypeName: typeName,
   401  		}
   402  	}
   403  
   404  	return &Result{
   405  		Bytes:    jsonBytes,
   406  		Error:    err,
   407  		TypeName: typeName,
   408  	}
   409  }
   410  
   411  // UsingBytesError Get created with nil.
   412  func (it newResultCreator) UsingBytesError(
   413  	bytesError *coredata.BytesError,
   414  ) Result {
   415  	if bytesError == nil {
   416  		return Result{}
   417  	}
   418  
   419  	return Result{
   420  		Bytes: bytesError.Bytes,
   421  		Error: bytesError.Error,
   422  	}
   423  }
   424  
   425  func (it newResultCreator) Error(err error) Result {
   426  	return Result{
   427  		Bytes: nil,
   428  		Error: err,
   429  	}
   430  }
   431  
   432  func (it newResultCreator) ErrorPtr(err error) *Result {
   433  	return &Result{
   434  		Bytes: nil,
   435  		Error: err,
   436  	}
   437  }
   438  
   439  func (it newResultCreator) Empty() Result {
   440  	return Result{}
   441  }
   442  
   443  func (it newResultCreator) EmptyPtr() *Result {
   444  	return &Result{}
   445  }
   446  
   447  func (it newResultCreator) TypeName(typeName string) *Result {
   448  	return &Result{
   449  		TypeName: typeName,
   450  	}
   451  }
   452  
   453  func (it newResultCreator) TypeNameBytes(typeName string) *Result {
   454  	return &Result{
   455  		TypeName: typeName,
   456  	}
   457  }
   458  
   459  func (it newResultCreator) Many(
   460  	anyItems ...interface{},
   461  ) *Result {
   462  	return it.AnyPtr(anyItems)
   463  }
   464  
   465  func (it newResultCreator) Serialize(
   466  	anyItem interface{},
   467  ) *Result {
   468  	jsonBytes, err := json.Marshal(anyItem)
   469  	typeName := reflectinternal.TypeName(anyItem)
   470  
   471  	if err != nil {
   472  		return &Result{
   473  			Bytes: jsonBytes,
   474  			Error: errcore.MarshallingFailedType.Error(
   475  				err.Error(),
   476  				typeName),
   477  			TypeName: typeName,
   478  		}
   479  	}
   480  
   481  	return &Result{
   482  		Bytes:    jsonBytes,
   483  		Error:    err,
   484  		TypeName: typeName,
   485  	}
   486  }
   487  
   488  func (it newResultCreator) Marshal(
   489  	anyItem interface{},
   490  ) *Result {
   491  	jsonBytes, err := json.Marshal(anyItem)
   492  	typeName := reflectinternal.TypeName(anyItem)
   493  
   494  	if err != nil {
   495  		return &Result{
   496  			Bytes: jsonBytes,
   497  			Error: errcore.MarshallingFailedType.Error(
   498  				err.Error(),
   499  				typeName),
   500  			TypeName: typeName,
   501  		}
   502  	}
   503  
   504  	return &Result{
   505  		Bytes:    jsonBytes,
   506  		Error:    err,
   507  		TypeName: typeName,
   508  	}
   509  }
   510  
   511  func (it newResultCreator) UsingSerializer(
   512  	serializer bytesSerializer,
   513  ) *Result {
   514  	if serializer == nil {
   515  		return nil
   516  	}
   517  
   518  	allBytes, err := serializer.Serialize()
   519  
   520  	return &Result{
   521  		Bytes: allBytes,
   522  		Error: err,
   523  		TypeName: reflectinternal.TypeName(
   524  			serializer),
   525  	}
   526  }
   527  
   528  func (it newResultCreator) UsingSerializerFunc(
   529  	serializerFunc func() ([]byte, error),
   530  ) *Result {
   531  	if serializerFunc == nil {
   532  		return nil
   533  	}
   534  
   535  	allBytes, err := serializerFunc()
   536  
   537  	return &Result{
   538  		Bytes:    allBytes,
   539  		Error:    err,
   540  		TypeName: reflectinternal.TypeName(serializerFunc),
   541  	}
   542  }
   543  
   544  func (it newResultCreator) UsingJsoner(
   545  	jsoner Jsoner,
   546  ) *Result {
   547  	if jsoner == nil {
   548  		return nil
   549  	}
   550  
   551  	return jsoner.JsonPtr()
   552  }
   553  
   554  // AnyToCastingResult
   555  //
   556  // accepted types (usages anyTo.SerializedJsonResult):
   557  //  - Result, *Result
   558  //  - []byte
   559  //  - string
   560  //  - jsoner
   561  //  - bytesSerializer
   562  //  - anyItem
   563  func (it newResultCreator) AnyToCastingResult(
   564  	anyItem interface{},
   565  ) *Result {
   566  	return AnyTo.SerializedJsonResult(anyItem)
   567  }