{"id":7201,"date":"2017-05-22T21:06:06","date_gmt":"2017-05-23T02:06:06","guid":{"rendered":"https:\/\/daedtech.wpenginepowered.com\/?p=7201"},"modified":"2017-05-22T21:06:06","modified_gmt":"2017-05-23T02:06:06","slug":"codeit-right-rules-explained-part-2","status":"publish","type":"post","link":"https:\/\/daedtech.com\/codeit-right-rules-explained-part-2\/","title":{"rendered":"CodeIt.Right Rules Explained, Part 2"},"content":{"rendered":"<p><em>Editorial Note: I originally wrote this post for the SubMain blog. \u00a0You can <a href=\"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx\">check out the original here, at their site<\/a>. \u00a0While you&#8217;re there, have a look at CodeIt.Right to help with automated code review.<\/em><\/p>\n<p>A little while back, I <a href=\"http:\/\/community.submain.com\/blogs\/submain\/archive\/2016\/11\/29\/codeit-right-rules-explained-part-1.aspx\">started a post series explaining some of the CodeIt.Right rules<\/a>. \u00a0I led into the post with a narrative, which I won&#8217;t retell. \u00a0But I will reiterate the two rules that I follow when it comes to static analysis tooling.<\/p>\n<ul>\n<li>Never implement a suggested fix without knowing what makes it a fix.<\/li>\n<li>Never ignore a suggested fix without understanding what makes it a fix.<\/li>\n<\/ul>\n<p>Because I follow these two rules, I find myself researching every fix suggested to me by my tooling. \u00a0And, since I&#8217;ve gone to the trouble of doing so, I&#8217;ll save you that same trouble by explaining some of those rules today. \u00a0Specifically, I&#8217;ll examine 3 more CodeIt.Right rules today and explain the rationale behind them.<\/p>\n<p><a href=\"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4361\" src=\"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg\" alt=\"\" width=\"1187\" height=\"830\" \/><\/a><\/p>\n<h3>Mark assemblies CLSCompliant<\/h3>\n<p>If you develop in .NET, you&#8217;ve no doubt run across this particular warning at some point in your career. \u00a0Before we get into the details, let&#8217;s stop and define the acronyms. \u00a0&#8220;CLS&#8221; stands for &#8220;Common Language Specification,&#8221; so the warning informs you that you need to mark your assemblies &#8220;Common Language\u00a0Specification Compliant&#8221; (or non-compliant, if applicable).<\/p>\n<p>Okay, but what does that mean? \u00a0Well, you can easily forget that many programming languages target the .NET runtime besides your language of choice. \u00a0CLS compliance indicates that\u00a0<em>any<\/em> language targeting the runtime can use your assembly. \u00a0You can write language specific code, incompatible with other framework languages. \u00a0CLS compliance means you haven&#8217;t.<\/p>\n<p>Want an example? \u00a0Let&#8217;s say that you write C# code and that you decide to get cute. \u00a0You have a class with a &#8220;DoStuff&#8221; method, and you want to add a slight variation on it. \u00a0Because the new method adds improved functionality, you decide to call it &#8220;DOSTUFF&#8221; in all caps to indicate its awesomeness. \u00a0No problem, says the C# compiler.<\/p>\n<p>And yet, if you you try to do the same thing in Visual Basic, a case insensitive language, you will encounter a compiler error. \u00a0You have written C# code\u00a0that VB code cannot use. \u00a0Thus you have written non-CLS compliant code. \u00a0The\u00a0CodeIt.Right rule exists to inform you that you have not specified your assembly&#8217;s compliance or non-compliance.<\/p>\n<p>To fix, go specify. \u00a0Ideally, go into the project&#8217;s AssemblyInfo.cs file and add the following to call it a day.<\/p>\n<pre class=\"\">[assembly:CLSCompliant(true)]\r\n<\/pre>\n<p>But you\u00a0can also specify non-compliance for the assembly to avoid a warning. \u00a0Of course, you can do better by marking the assembly compliant on the whole and then hunting down and flagging non-compliant methods with the attribute.<\/p>\n<h3>Specify IFormatProvider<\/h3>\n<p>Next up, consider a warning to &#8220;specify IFormatProvider.&#8221; \u00a0When you encounter this for the first time, it might leave you scratching your head. \u00a0After all, &#8220;IFormatProvider&#8221; seems a bit&#8230; technician-like. \u00a0A more newbie-friendly name for this warning might have been, &#8220;you have a localization problem.&#8221;<\/p>\n<p>For example, consider a situation in which some external supplies a date. \u00a0Except, they supply the date as a string and you have the task of converting it to a proper DateTime so that you can perform operations on it. \u00a0No problem, right?<\/p>\n<pre class=\"lang:c# decode:true \">var properDate = DateTime.Parse(inputString);<\/pre>\n<p>That should work, provided provincial concerns do not intervene. \u00a0For those of you in the US, &#8220;03\/02\/1995&#8221; corresponds to March 2nd, 1995. \u00a0Of course, should you live in Iraq, that date string would correspond to February 3rd, 1995. \u00a0Oops.<\/p>\n<p>Consider a nightmare scenario wherein you write some code with this parsing mechanism. \u00a0Based in the US and with most of your customers in the US, this works for years. \u00a0Eventually, though, your sales group starts making inroads elsewhere. \u00a0Years after the fact, you wind up with a strange bug in code you haven&#8217;t touched for years. \u00a0Yikes.<\/p>\n<p>By specifying a format provider, you can avoid this scenario.<\/p>\n<h3>Nested types should not be visible<\/h3>\n<p>Unlike the previous rule, this one&#8217;s name suffices for description. \u00a0If you declare a type within another type (say a class within a class), you should not make the nested type visible outside of the outer type. \u00a0So, the following code triggers the warning.<\/p>\n<pre class=\"lang:c# decode:true \">public class Outer\r\n{\r\n    public class Nested\r\n    {\r\n\r\n    }\r\n}<\/pre>\n<p>To understand the issue here, consider the object oriented principle of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Encapsulation_(computer_programming)\">encapsulation<\/a>. \u00a0In short, hiding implementation details from outsiders gives you more freedom to vary those details later, at your discretion. \u00a0This thinking drives the rote instinct for OOP programmers to declare private fields and expose them via public accessors\/mutators\/properties.<\/p>\n<p>To some degree, the same reasoning applies here. \u00a0If you declare a class or struct inside of another one, then presumably only the containing type needs the nested one. \u00a0In that case, why make it public? \u00a0On the other hand, if another type does, in fact, need the nested one, why scope it within a parent type and not just the same namespace?<\/p>\n<p>You may have some reason for doing this &#8212; something specific to your code and your implementation. \u00a0But understand that this is\u00a0<em>weird<\/em>, and will tend to create awkward, hard-to-discover code. \u00a0For this reason, your static analysis tool flags your code.<\/p>\n<h3>Until Next Time<\/h3>\n<p>As I said last time, you can extract a ton of value from understanding code analysis rules. \u00a0This goes beyond just understanding your tooling and accepted best practice. \u00a0Specifically, it gets you in the habit of researching and understanding your code and applications at a deep, philosophical level.<\/p>\n<p>In this post alone, we&#8217;ve discussed language interoperability, geographic maintenance concerns, and object oriented design. \u00a0You can, all too easily, dismiss analysis rules as perfectionism. \u00a0They aren&#8217;t; they have very real, very important applications.<\/p>\n<p>Stay tuned for more posts in this series, aimed at helping you understand your tooling.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Editorial Note: I originally wrote this post for the SubMain blog. \u00a0You can check out the original here, at their site. \u00a0While you&#8217;re there, have a look at CodeIt.Right to help with automated code review. A little while back, I started a post series explaining some of the CodeIt.Right rules. \u00a0I led into the post&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[67],"tags":[10,37,216],"class_list":["post-7201","post","type-post","status-publish","format-standard","hentry","category-net","tag-c","tag-code-review","tag-submain"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CodeIt.Right Rules Explained, Part 2 - DaedTech<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"CodeIt.Right Rules Explained, Part 2 - DaedTech\" \/>\n<meta name=\"twitter:description\" content=\"Editorial Note: I originally wrote this post for the SubMain blog. \u00a0You can check out the original here, at their site. \u00a0While you&#8217;re there, have a look at CodeIt.Right to help with automated code review. A little while back, I started a post series explaining some of the CodeIt.Right rules. \u00a0I led into the post...\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Erik Dietrich\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/codeit-right-rules-explained-part-2\\\/\"},\"author\":{\"name\":\"Erik Dietrich\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/person\\\/3dae63e91a0fa60c8051a2171fa687d2\"},\"headline\":\"CodeIt.Right Rules Explained, Part 2\",\"datePublished\":\"2017-05-23T02:06:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/codeit-right-rules-explained-part-2\\\/\"},\"wordCount\":972,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#organization\"},\"image\":{\"@id\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2014\\\/11\\\/Oppenheimer.jpg\",\"keywords\":[\"C#\",\"Code Review\",\"SubMain\"],\"articleSection\":[\".NET\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/codeit-right-rules-explained-part-2\\\/\",\"url\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx\",\"name\":\"CodeIt.Right Rules Explained, Part 2 - DaedTech\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2014\\\/11\\\/Oppenheimer.jpg\",\"datePublished\":\"2017-05-23T02:06:06+00:00\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#primaryimage\",\"url\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2014\\\/11\\\/Oppenheimer.jpg\",\"contentUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2014\\\/11\\\/Oppenheimer.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/submain.com\\\/blog\\\/CodeItRightRulesExplainedPart2.aspx#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/daedtech.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CodeIt.Right Rules Explained, Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#website\",\"url\":\"https:\\\/\\\/daedtech.com\\\/\",\"name\":\"DaedTech\",\"description\":\"Stories about Software\",\"publisher\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/daedtech.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#organization\",\"name\":\"DaedTech LLC\",\"url\":\"https:\\\/\\\/daedtech.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2015\\\/07\\\/SmallLogo.jpg\",\"contentUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2015\\\/07\\\/SmallLogo.jpg\",\"width\":82,\"height\":84,\"caption\":\"DaedTech LLC\"},\"image\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/person\\\/3dae63e91a0fa60c8051a2171fa687d2\",\"name\":\"Erik Dietrich\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg\",\"caption\":\"Erik Dietrich\"},\"sameAs\":[\"https:\\\/\\\/daedtech.com\"],\"url\":\"https:\\\/\\\/daedtech.com\\\/author\\\/erik\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CodeIt.Right Rules Explained, Part 2 - DaedTech","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx","twitter_card":"summary_large_image","twitter_title":"CodeIt.Right Rules Explained, Part 2 - DaedTech","twitter_description":"Editorial Note: I originally wrote this post for the SubMain blog. \u00a0You can check out the original here, at their site. \u00a0While you&#8217;re there, have a look at CodeIt.Right to help with automated code review. A little while back, I started a post series explaining some of the CodeIt.Right rules. \u00a0I led into the post...","twitter_image":"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg","twitter_misc":{"Written by":"Erik Dietrich","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#article","isPartOf":{"@id":"https:\/\/daedtech.com\/codeit-right-rules-explained-part-2\/"},"author":{"name":"Erik Dietrich","@id":"https:\/\/daedtech.com\/#\/schema\/person\/3dae63e91a0fa60c8051a2171fa687d2"},"headline":"CodeIt.Right Rules Explained, Part 2","datePublished":"2017-05-23T02:06:06+00:00","mainEntityOfPage":{"@id":"https:\/\/daedtech.com\/codeit-right-rules-explained-part-2\/"},"wordCount":972,"commentCount":0,"publisher":{"@id":"https:\/\/daedtech.com\/#organization"},"image":{"@id":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#primaryimage"},"thumbnailUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg","keywords":["C#","Code Review","SubMain"],"articleSection":[".NET"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#respond"]}]},{"@type":"WebPage","@id":"https:\/\/daedtech.com\/codeit-right-rules-explained-part-2\/","url":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx","name":"CodeIt.Right Rules Explained, Part 2 - DaedTech","isPartOf":{"@id":"https:\/\/daedtech.com\/#website"},"primaryImageOfPage":{"@id":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#primaryimage"},"image":{"@id":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#primaryimage"},"thumbnailUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg","datePublished":"2017-05-23T02:06:06+00:00","breadcrumb":{"@id":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#primaryimage","url":"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg","contentUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2014\/11\/Oppenheimer.jpg"},{"@type":"BreadcrumbList","@id":"http:\/\/submain.com\/blog\/CodeItRightRulesExplainedPart2.aspx#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/daedtech.com\/"},{"@type":"ListItem","position":2,"name":"CodeIt.Right Rules Explained, Part 2"}]},{"@type":"WebSite","@id":"https:\/\/daedtech.com\/#website","url":"https:\/\/daedtech.com\/","name":"DaedTech","description":"Stories about Software","publisher":{"@id":"https:\/\/daedtech.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/daedtech.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/daedtech.com\/#organization","name":"DaedTech LLC","url":"https:\/\/daedtech.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/daedtech.com\/#\/schema\/logo\/image\/","url":"https:\/\/daedtech.com\/wp-content\/uploads\/2015\/07\/SmallLogo.jpg","contentUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2015\/07\/SmallLogo.jpg","width":82,"height":84,"caption":"DaedTech LLC"},"image":{"@id":"https:\/\/daedtech.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/daedtech.com\/#\/schema\/person\/3dae63e91a0fa60c8051a2171fa687d2","name":"Erik Dietrich","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg","caption":"Erik Dietrich"},"sameAs":["https:\/\/daedtech.com"],"url":"https:\/\/daedtech.com\/author\/erik\/"}]}},"_links":{"self":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/posts\/7201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/comments?post=7201"}],"version-history":[{"count":0,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/posts\/7201\/revisions"}],"wp:attachment":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/media?parent=7201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/categories?post=7201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/tags?post=7201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}