@@ -1877,9 +1877,11 @@ lyd_validate(struct lyd_node **tree, const struct lys_module *module, const stru
18771877 ext_node_p , ext_val_p , val_opts , diff );
18781878 LY_VAL_ERR_GOTO (r , rc = r , val_opts , cleanup );
18791879
1880- /* perform final validation that assumes the data tree is final */
1881- r = lyd_validate_final_r (* first2 , NULL , NULL , mod , val_opts , 0 , 0 );
1882- LY_VAL_ERR_GOTO (r , rc = r , val_opts , cleanup );
1880+ if (!(val_opts & LYD_VALIDATE_NOT_FINAL )) {
1881+ /* perform final validation that assumes the data tree is final */
1882+ r = lyd_validate_final_r (* first2 , NULL , NULL , mod , val_opts , 0 , 0 );
1883+ LY_VAL_ERR_GOTO (r , rc = r , val_opts , cleanup );
1884+ }
18831885 }
18841886
18851887cleanup :
@@ -1909,14 +1911,36 @@ lyd_validate_all(struct lyd_node **tree, const struct ly_ctx *ctx, uint32_t val_
19091911LIBYANG_API_DEF LY_ERR
19101912lyd_validate_module (struct lyd_node * * tree , const struct lys_module * module , uint32_t val_opts , struct lyd_node * * diff )
19111913{
1912- LY_CHECK_ARG_RET (NULL , tree , * tree || module , LY_EINVAL );
1913- LY_CHECK_CTX_EQUAL_RET (* tree ? LYD_CTX (* tree ) : NULL , module ? module -> ctx : NULL , LY_EINVAL );
1914+ LY_CHECK_ARG_RET (NULL , tree , module , !( val_opts & LYD_VALIDATE_PRESENT ) , LY_EINVAL );
1915+ LY_CHECK_CTX_EQUAL_RET (* tree ? LYD_CTX (* tree ) : NULL , module -> ctx , LY_EINVAL );
19141916 if (diff ) {
19151917 * diff = NULL ;
19161918 }
19171919
1918- return lyd_validate (tree , module , (* tree ) ? LYD_CTX (* tree ) : module -> ctx , val_opts , 1 , NULL , NULL , NULL , NULL , NULL ,
1919- diff );
1920+ return lyd_validate (tree , module , module -> ctx , val_opts , 1 , NULL , NULL , NULL , NULL , NULL , diff );
1921+ }
1922+
1923+ LIBYANG_API_DEF LY_ERR
1924+ lyd_validate_module_final (struct lyd_node * tree , const struct lys_module * module , uint32_t val_opts )
1925+ {
1926+ LY_ERR r , rc = LY_SUCCESS ;
1927+ struct lyd_node * first ;
1928+ const struct lys_module * mod ;
1929+ uint32_t i = 0 ;
1930+
1931+ LY_CHECK_ARG_RET (NULL , module , !(val_opts & (LYD_VALIDATE_PRESENT | LYD_VALIDATE_NOT_FINAL )), LY_EINVAL );
1932+ LY_CHECK_CTX_EQUAL_RET (LYD_CTX (tree ), module -> ctx , LY_EINVAL );
1933+
1934+ /* module is unchanged but we need to get the first module data node */
1935+ mod = lyd_mod_next_module (tree , module , module -> ctx , & i , & first );
1936+ assert (mod );
1937+
1938+ /* perform final validation that assumes the data tree is final */
1939+ r = lyd_validate_final_r (first , NULL , NULL , mod , val_opts , 0 , 0 );
1940+ LY_VAL_ERR_GOTO (r , rc = r , val_opts , cleanup );
1941+
1942+ cleanup :
1943+ return rc ;
19201944}
19211945
19221946/**
0 commit comments