Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add yin plugin #41

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Conversation

ljbevemyr
Copy link
Contributor

This commit adds the yin plugin which generates YIN from the input YANG
model, along with tests to compare the Pyang YIN plugin.

Two different options are available for the plugin:

  • pretty strings, will print strings on multiple lines
  • canonical, prints elements in canonical order

This commit adds the yin plugin which generates yin from the input YANG
model, along with tests to compare the Pyang YIN plugin.

Two different options are available for the plugin:
- pretty strings, will print strings on multiple lines
- canonical, prints elements in canonical order
@fnchooft
Copy link
Contributor

fnchooft commented Sep 7, 2021

Evening Lisa, great to see yin-support coming to yanger!
The only observation is the generation of xml-elements from imported yang models such as tailf-common.yang with prefix 'tailf'. In this case the implementation is using the modulename instead of the prefix.

I attempted a quick fix:

diff --git a/plugins/yanger_yin.erl b/plugins/yanger_yin.erl
index cdd91c0..a90f010 100644
--- a/plugins/yanger_yin.erl
+++ b/plugins/yanger_yin.erl
@@ -104,6 +104,7 @@ emit_stmts([], _Lvl, _S) ->
     ok;
 emit_stmts([Stmt|Stmts], Lvl, S) ->
     OutF = S#state.outf,
+    Ctx = S#state.ctx,
     Keyword = yang:stmt_keyword(Stmt),
     emit_stmt_keyword(Keyword, Lvl, S),
     YinElement = emit_stmt_arg(yang:stmt_arg(Stmt), Lvl, S, Keyword),
@@ -121,7 +122,14 @@ emit_stmts([Stmt|Stmts], Lvl, S) ->
                         {S, SubStmts0}
                 end,
             emit_stmts(SubStmts, Lvl+1, NewS),
-            KeywordStr = make_str(Keyword),
+            KeywordStr = case is_tuple(Keyword) of
+                true ->
+                    {ModuleName, Key} = Keyword,
+                    Prefix  = search_for_prefix(ModuleName,Ctx),
+                    make_str({Prefix,Key});
+                _ ->
+                    make_str(Keyword)
+            end,
             OutF([indent(Lvl),ot(),fs(),KeywordStr,ct(),nl()])
     end,
     emit_stmts(Stmts, Lvl, NewS).
@@ -146,7 +154,8 @@ emit_stmt_arg(Arg, Lvl, S, Keyword) ->
     if is_tuple(Keyword) ->
             {Type, YinElement} = search_for_extension(Keyword, Ctx),
             if YinElement ->
-                    {Prefix, _} = Keyword,
+                    {ModuleName, _} = Keyword,
+                    Prefix  = search_for_prefix(ModuleName,Ctx),
                     TypeStr = make_str({Prefix, Type});
                true ->
                     TypeStr = make_str(Type)
@@ -243,6 +252,20 @@ search_for_namespace(undefined, Mod, Ctx) ->
 search_for_namespace(Namespace, _Mod, _Ctx) ->
     Namespace.
 
+
+search_for_prefix(ModuleName, Ctx) ->
+    Target = yang:search_module(Ctx, ModuleName, undefined),
+    case Target of
+        {true, _, TargetMod} ->
+            make_str(TargetMod#module.prefix);
+        _ ->
+            undefined
+    end.
+
+
+
+
+
 module_arg_imports(_S, _Ctx, [], _Indent) ->
     skip;
 module_arg_imports(S, Ctx, [Import|Imports], Indent) ->

And this produces valid xml-files where the prefixes are correctly used as namespace.

Kind regards, and thanks for this great plugin!

@mbj4668
Copy link
Owner

mbj4668 commented Dec 9, 2021

Sorry for the late response... @fnchooft perhaps you can do a new PR from your branch, with this fix?

@fnchooft
Copy link
Contributor

Hi @mbj4668 - I have added a patch-request with the fixes for the yin-plugin. Apologies for the delay - but vacation was needed after 2021! :)

@fnchooft
Copy link
Contributor

fnchooft commented Mar 4, 2022

I believe this patch entered into main-branch after applied fixes.
The only thing that would need to be rebased is the xml-skeleton addition from @ljbevemyr in order to have all the functionality complete.

@ljbevemyr
Copy link
Contributor Author

Hi @fnchooft, thank you for adding patch to the yin-plugin! I will rebase the xml-skeleton.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants