diff --git a/client/android/div/src/main/java/com/yandex/div/core/util/DivDataExtensions.kt b/client/android/div/src/main/java/com/yandex/div/core/util/DivDataExtensions.kt index b1ecd4371..e6d3ebcee 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/util/DivDataExtensions.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/util/DivDataExtensions.kt @@ -192,7 +192,7 @@ internal fun DivPivot?.equalsToConstant(other: DivPivot?): Boolean { internal fun DivPivot?.isConstant(): Boolean { return when (this) { null -> true - is DivPivot.Fixed -> value.value.isConstantOrNull() && value.value.isConstantOrNull() + is DivPivot.Fixed -> value.value.isConstant() && value.unit.isConstant() is DivPivot.Percentage -> value.value.isConstant() } } diff --git a/client/android/div/src/main/java/com/yandex/div/core/util/ExpressionSubscribers.kt b/client/android/div/src/main/java/com/yandex/div/core/util/ExpressionSubscribers.kt index 0def9984d..e5c5a7b42 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/util/ExpressionSubscribers.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/util/ExpressionSubscribers.kt @@ -126,7 +126,7 @@ internal fun ExpressionSubscriber.observePivot( is DivPivot.Fixed -> { val fixedPivot = pivot.value - addSubscription(fixedPivot.value?.observe(resolver, callback)) + addSubscription(fixedPivot.value.observe(resolver, callback)) addSubscription(fixedPivot.unit.observe(resolver, callback)) } diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt index 1ab287619..cbcf4fa65 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt @@ -147,7 +147,7 @@ internal fun View.applyTransform( private fun View.getPivotValue(len: Int, divPivot: DivPivot, resolver: ExpressionResolver): Float { return when (val pivot = divPivot.value()) { is DivPivotFixed -> { - val offset = pivot.value?.evaluate(resolver)?.toFloat() ?: return len / 2f + val offset = pivot.value.evaluate(resolver).toFloat() when (pivot.unit.evaluate(resolver)) { DivSizeUnit.DP -> offset.dpToPxF(resources.displayMetrics) DivSizeUnit.PX -> offset diff --git a/client/ios/DivKit/generated_sources/DivPivotFixed.swift b/client/ios/DivKit/generated_sources/DivPivotFixed.swift index 27dd210bd..144083ba4 100644 --- a/client/ios/DivKit/generated_sources/DivPivotFixed.swift +++ b/client/ios/DivKit/generated_sources/DivPivotFixed.swift @@ -7,7 +7,7 @@ import VGSL public final class DivPivotFixed: Sendable { public static let type: String = "pivot-fixed" public let unit: Expression // default value: dp - public let value: Expression? + public let value: Expression public func resolveUnit(_ resolver: ExpressionResolver) -> DivSizeUnit { resolver.resolveEnum(unit) ?? DivSizeUnit.dp @@ -20,13 +20,13 @@ public final class DivPivotFixed: Sendable { public convenience init(dictionary: [String: Any], context: ParsingContext) throws { self.init( unit: try dictionary.getOptionalExpressionField("unit", context: context), - value: try dictionary.getOptionalExpressionField("value", context: context) + value: try dictionary.getExpressionField("value", context: context) ) } init( unit: Expression? = nil, - value: Expression? = nil + value: Expression ) { self.unit = unit ?? .value(.dp) self.value = value @@ -53,7 +53,7 @@ extension DivPivotFixed: Serializable { var result: [String: ValidSerializationValue] = [:] result["type"] = Self.type result["unit"] = unit.toValidSerializationValue() - result["value"] = value?.toValidSerializationValue() + result["value"] = value.toValidSerializationValue() return result } } diff --git a/client/ios/DivKit/generated_sources/DivPivotFixedTemplate.swift b/client/ios/DivKit/generated_sources/DivPivotFixedTemplate.swift index 131ac3ba7..94f43f9a3 100644 --- a/client/ios/DivKit/generated_sources/DivPivotFixedTemplate.swift +++ b/client/ios/DivKit/generated_sources/DivPivotFixedTemplate.swift @@ -30,14 +30,22 @@ public final class DivPivotFixedTemplate: TemplateValue, Sendable { private static func resolveOnlyLinks(context: TemplatesContext, parent: DivPivotFixedTemplate?) -> DeserializationResult { let unitValue = { parent?.unit?.resolveOptionalValue(context: context) ?? .noValue }() - let valueValue = { parent?.value?.resolveOptionalValue(context: context) ?? .noValue }() - let errors = mergeErrors( + let valueValue = { parent?.value?.resolveValue(context: context) ?? .noValue }() + var errors = mergeErrors( unitValue.errorsOrWarnings?.map { .nestedObjectError(field: "unit", error: $0) }, valueValue.errorsOrWarnings?.map { .nestedObjectError(field: "value", error: $0) } ) + if case .noValue = valueValue { + errors.append(.requiredFieldIsMissing(field: "value")) + } + guard + let valueNonNil = valueValue.value + else { + return .failure(NonEmptyArray(errors)!) + } let result = DivPivotFixed( unit: { unitValue.value }(), - value: { valueValue.value }() + value: { valueNonNil }() ) return errors.isEmpty ? .success(result) : .partialSuccess(result, warnings: NonEmptyArray(errors)!) } @@ -75,13 +83,21 @@ public final class DivPivotFixedTemplate: TemplateValue, Sendable { }() } }() - let errors = mergeErrors( + var errors = mergeErrors( unitValue.errorsOrWarnings?.map { .nestedObjectError(field: "unit", error: $0) }, valueValue.errorsOrWarnings?.map { .nestedObjectError(field: "value", error: $0) } ) + if case .noValue = valueValue { + errors.append(.requiredFieldIsMissing(field: "value")) + } + guard + let valueNonNil = valueValue.value + else { + return .failure(NonEmptyArray(errors)!) + } let result = DivPivotFixed( unit: { unitValue.value }(), - value: { valueValue.value }() + value: { valueNonNil }() ) return errors.isEmpty ? .success(result) : .partialSuccess(result, warnings: NonEmptyArray(errors)!) } diff --git a/client/ios/DivKit/generated_sources/DivPivotTemplate.swift b/client/ios/DivKit/generated_sources/DivPivotTemplate.swift index d9475fd65..46277aef5 100644 --- a/client/ios/DivKit/generated_sources/DivPivotTemplate.swift +++ b/client/ios/DivKit/generated_sources/DivPivotTemplate.swift @@ -65,8 +65,9 @@ public enum DivPivotTemplate: TemplateValue, Sendable { } private static func resolveUnknownValue(context: TemplatesContext, useOnlyLinks: Bool) -> DeserializationResult { - let raw = context.templateData["type"] as? String ?? DivPivotFixed.type - let type = context.templateToType[raw] ?? raw + guard let type = (context.templateData["type"] as? String).flatMap({ context.templateToType[$0] ?? $0 }) else { + return .failure(NonEmptyArray(.requiredFieldIsMissing(field: "type"))) + } return { var result: DeserializationResult? diff --git a/schema/div-pivot-fixed.json b/schema/div-pivot-fixed.json index 73a1caa3d..ffeca25d0 100644 --- a/schema/div-pivot-fixed.json +++ b/schema/div-pivot-fixed.json @@ -22,5 +22,9 @@ "android", "ios", "web" + ], + "required": [ + "type", + "value" ] }